一个目录下的GetTempFileName函数?

18
.NET框架定义了一个System.IO.Path.GetTempFileName方法,它保证生成的临时文件名是唯一的。尽管这种情况极不可能,但已知此文件名可能与相同路径下的目录名称相同,这意味着我不能假设通过获取该文件名、删除它并创建具有相同名称的目录,就可以得到一个与任何其他目录都不同的唯一命名的目录。而且,我无法指定GetTempFileName应在其下创建临时文件的路径。似乎不存在用于目录的GetTempFileName等效函数。
是否存在用于创建唯一目录的GetTempFileName等效函数?如果没有,最佳方法是在指定位置创建唯一目录(即我指定要创建唯一目录的路径)是什么?

问题在于你使用API获取了一个唯一的临时文件名(当然是在系统临时文件夹内),然后用它来创建一个同名的目录,这本质上是错误的。你应该编辑你的问题并将标题改为:“如何获取唯一的随机不存在的目录名称?”或类似的内容。 - Davide Piras
2
请注意 GetTempFileName 可以创建最多 65535 个临时文件。如果您的程序(或其他程序)不删除这些文件,就会出现一种泄漏情况。一旦有了 65535 个这样的文件(慢慢积累),您将会在使用 GetTempFileName 创建临时文件的任何地方看到奇怪的问题发生。 - bart s
4个回答

24

你可以使用 Guid.NewGuid().ToString() 来完成这个任务。


这样的话,就像这样... Directory.CreateDirectory(Path.GetTempPath() + Guid.NewGuid().ToString()); - Jez
7
是的,这可能是一种方法。使用 Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()) - DanielB

11

如果您想要一个更短的目录名称(8.3格式),可以使用 GetRandomFileName() 来代替Guid:

    public static string GetRandomTempPath()
    {
        var tempDir = System.IO.Path.GetTempPath();

        string fullPath;
        do
        {
            var randomName = System.IO.Path.GetRandomFileName();
            fullPath = System.IO.Path.Combine(tempDir, randomName);
        }
        while (Directory.Exists(fullPath));

        return fullPath;
    }

7
string basePath = @"c:\test\";    // or use Path.GetTempPath

string tempPath;
do
{
    tempPath = Path.Combine(basePath, Guid.NewGuid().ToString("N"));
} while (Directory.Exists(tempPath));

try
{
    Directory.CreateDirectory(tempPath);
}
catch
{
    // something went wrong!
}

1

你可以使用 Guid 创建唯一的名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接