代码之家  ›  专栏  ›  技术社区  ›  Piotr Czapla

为什么tempfilecollection在addextension(“tmp”)处引发异常?

  •  2
  • Piotr Czapla  · 技术社区  · 15 年前

    有人知道下面的代码为什么抛出System.ArgumentException吗?

    using (var tfc = new TempFileCollection())
    {                
        var fn = tfc.AddExtension("tmp");
        Console.WriteLine(fn);
    }
    

    以下是具体的例外情况:

    System.ArgumentException: The file name 'C:\Users\pczapla\AppData\Local\Temp\iqulrqva.tmp' was already in the collection.
    Parameter name: fileName.
    
    2 回复  |  直到 15 年前
        1
  •  1
  •   user7116    15 年前

    一个小小的Reflector动作将显示以下有趣的片段 TempFileCollection :

    new FileIOPermission(FileIOPermissionAccess.AllAccess, basePath).Demand();
    path = this.basePath + ".tmp";
    using (new FileStream(path, FileMode.CreateNew, FileAccess.Write))
    {
    }
    flag = true;
    ...
    this.files.Add(path, this.keepFiles);
    

    这个在里面 TempFileCollection.EnsureTempNameCreated ,由调用 TempFileCollection.BasePath ,由调用 TempFileCollection.AddExtension . 我猜占位符使用了“.tmp”,所以您不能。

        2
  •  1
  •   LukeH    15 年前

    似乎你第一次打电话给 AddExtension 方法,它将自动向集合添加扩展名为“tmp”的文件名,然后尝试使用指定的扩展名添加文件名。

    因此,如果您指定“tmp”作为扩展名,那么它将尝试添加同一个文件两次,从而导致异常。

    using (var tfc = new TempFileCollection())
    {
        var foo = tfc.AddExtension("foo");
        var bar = tfc.AddExtension("bar");
    
        foreach (var f in tfc)
        {
            Console.WriteLine(f);
        }
    }
    

    上述代码将生成以下输出。注意,它包含一个扩展名为“tmp”的文件名,但我们没有明确添加。

    C:\Users\Luke\AppData\Local\Temp\jmat4jqg.tmp
    C:\Users\Luke\AppData\Local\Temp\jmat4jqg.bar
    C:\Users\Luke\AppData\Local\Temp\jmat4jqg.foo