为什么TempFileCollection会在AddExtension(“tmp”)中抛出异常?

时间:2009-08-20 16:07:35

标签: c# .net

有谁知道为什么下面的代码抛出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 个答案:

答案 0 :(得分:1)

似乎第一次调用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

答案 1 :(得分:1)

一点反射操作会在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”,所以你不能。