如果TempFileCollection.AddExtension没有返回唯一名称,它的用途是什么?

时间:2015-10-30 09:02:51

标签: c# .net file msdn

我需要创建三个临时XML文件以进行调试。我正在使用TempFileCollection,因为它适合账单,但显然AddExtension方法实际上并不返回唯一的文件名。

根据to the MSDN

  

此方法只能为每个文件扩展名调用一次,因为如果使用相同的扩展名调用它,它将返回相同的名称。

显然我只需要使用AddFile方法添加我自己的文件。那么这种方法的用途是什么?为了解决这个问题,我只是在使用

var filename = Guid.NewGuid().ToString + ".xml"
collection.AddFile(filename, false);

3 个答案:

答案 0 :(得分:1)

MSDN中的TempFileCollection个文档:

  

要为特定文件扩展名的临时文件生成唯一名称,请调用AddExtension并指定要生成的文件名的扩展名。 AddExtension方法将返回一个字符串,该字符串由TempDir属性指定的目录中指定扩展名的文件名的完整路径组成。 AddExtension方法只返回一个唯一的文件名每个文件扩展名

TempFileCollection位于System.CodeDom.Compiler名称空间中。如果您只想创建一些临时文件,请使用Path.GetTempFileName

Console.WriteLine(Path.ChangeExtension(Path.GetTempFileName(), "xml"));
Console.WriteLine(Path.ChangeExtension(Path.GetTempFileName(), "xml"));
Console.WriteLine(Path.ChangeExtension(Path.GetTempFileName(), "xml"));
// You got three different files with .xml extension.

Path.GetTempFileName()创建的文件不会自动删除。要自动清理临时文件,请使用System.IO.FileOptions.DeleteOnClose。请参阅Windows temporary files behaviour - are they deleted by the system?处的类似问题。一段示例代码就像这样

var path = Path.GetTempFileName();
Console.WriteLine(path);
using (var fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite, 4000, 
    FileOptions.DeleteOnClose))
{
    fs.WriteByte(65);
}

我知道包含其他不相关的参数很愚蠢,但它是如何设计的。您可以将fs打包到其他热门中或将其传递给XDocument/XElement.Save()

var e = new XElement("Node");
e.Save(fs);

答案 1 :(得分:0)

TempFileCollection并不是为您创建临时 fileNames ,它只会保存临时文件,并会在Delete()中请求时删除它们,或者在处理集合时删除它们。见a.o.物业KeepFiles。

要生成唯一的文件名,请使用System.IO.Path.GetTempFileName和System.IO.Path.changeExtension

答案 2 :(得分:0)

TempFileCollectionSystem.CodeDom.Compiler 命名空间中。这意味着它可供编译器使用。

基于此,我可以查看 TempFileCollection 的两个不同用例:

  • 创建一组不相关的临时文件,并确保在之后清理它们。
  • 创建一组具有不同扩展名的相关文件,并确保之后清理它们。

对于第二项(相关文件),只需查看 binobj 文件夹。您可能有多个文件对应于同一个文件。例如:

  • Program.exe
  • Program.exe.config
  • Program.pdb

因此,我将为与 TempFileCollection 相关的所有文件创建一个 Program。然后,我可以调用 AddExtension 来获取 .exe 文件的临时文件。我不需要将该路径存储在变量中 - 我只需再次调用 AddExtension 即可获得相同的路径。

TL;博士:

  • AddFile 用于第一个用例(不相关的临时文件)
  • AddExtension 用于第二个用例(相关的临时文件,所有文件都有独特的扩展名)