我需要创建三个临时XML文件以进行调试。我正在使用TempFileCollection,因为它适合账单,但显然AddExtension
方法实际上并不返回唯一的文件名。
根据to the MSDN:
此方法只能为每个文件扩展名调用一次,因为如果使用相同的扩展名调用它,它将返回相同的名称。
显然我只需要使用AddFile
方法添加我自己的文件。那么这种方法的用途是什么?为了解决这个问题,我只是在使用
var filename = Guid.NewGuid().ToString + ".xml"
collection.AddFile(filename, false);
答案 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)
TempFileCollection
在 System.CodeDom.Compiler
命名空间中。这意味着它可供编译器使用。
基于此,我可以查看 TempFileCollection
的两个不同用例:
对于第二项(相关文件),只需查看 bin
和 obj
文件夹。您可能有多个文件对应于同一个文件。例如:
Program.exe
Program.exe.config
Program.pdb
因此,我将为与 TempFileCollection
相关的所有文件创建一个 Program
。然后,我可以调用 AddExtension
来获取 .exe
文件的临时文件。我不需要将该路径存储在变量中 - 我只需再次调用 AddExtension
即可获得相同的路径。
TL;博士:
AddFile
用于第一个用例(不相关的临时文件)AddExtension
用于第二个用例(相关的临时文件,所有文件都有独特的扩展名)