创建临时文件夹

时间:2020-03-05 18:40:49  来源:igfitidea点击:

我正在开发一个程序,该程序需要为该应用程序创建多个临时文件夹。这些将不会被用户看到。该应用程序是用VB.net编写的。我可以想到几种方法,例如增量文件夹名称或者随机编号的文件夹名称,但是我想知道其他人如何解决此问题?

解决方案

回答

只要文件夹的名称不需要有意义,对它们使用GUID怎么办?

回答

我们可以为临时文件夹名称生成一个GUID。

回答

我们可以使用GetTempFileName创建一个临时文件,然后删除该文件并将其重新创建为目录。

注意:链接无效,请从以下位置复制/粘贴:http://msdn.microsoft.com/zh-cn/library/aa364991(VS.85).aspx

回答

我们必须使用System.IO.Path.GetTempFileName()

Creates a uniquely named, zero-byte temporary file on disk and returns the full path of that file.

我们可以使用System.IO.Path.GetDirectoryName(System.IO.Path.GetTempFileName())仅获取临时文件夹信息,并在其中创建文件夹

它们是在Windows临时文件夹中创建的,这被认为是最佳实践

回答

就像是...

using System.IO;

string path = Path.GetTempPath() + Path.GetRandomFileName();
while (Directory.Exists(path))
 path = Path.GetTempPath() + Path.GetRandomFileName();

Directory.CreateDirectory(path);

回答

@ adam-wright和pix0r的组合答案将是最好的恕我直言:

using System.IO;

string path = Path.GetTempPath() + Path.GetRandomFileName();

while (Directory.Exists(path)) 
  path = Path.GetTempPath() + Path.GetRandomFileName();

File.Delete(path);
Directory.CreateDirectory(path);

回答

使用System.IO.Path.GetTempFileName的优点是它将是用户本地(即非漫游)路径中的文件。出于权限和安全原因,这正是我们想要的位置。

回答

更新:添加了File.Exists检查每个评论(2012年6月19日)

这就是我在VB.NET中使用的内容。基本上与显示的相同,除了我通常不想立即创建该文件夹。

使用GetRandomFilename的优点是它不会创建文件,因此,如果我们将名称用于文件以外的其他内容,则无需清理。就像使用它作为文件夹名称一样。

Private Function GetTempFolder() As String
    Dim folder As String = Path.Combine(Path.GetTempPath, Path.GetRandomFileName)
    Do While Directory.Exists(folder) or File.Exists(folder)
        folder = Path.Combine(Path.GetTempPath, Path.GetRandomFileName)
    Loop

    Return folder
End Function

随机文件名示例:

C:\ Documents and Settings \用户名\ Local Settings \ Temp \ u3z5e0co.tvq

这是使用Guid获取临时文件夹名称的一种变体。

Private Function GetTempFolderGuid() As String
    Dim folder As String = Path.Combine(Path.GetTempPath, Guid.NewGuid.ToString)
    Do While Directory.Exists(folder) or File.Exists(folder)
        folder = Path.Combine(Path.GetTempPath, Guid.NewGuid.ToString)
    Loop

    Return folder
End Function

guid示例:

C:\ Documents and Settings \用户名\ Local Settings \ Temp \ 2dbc6db7-2d45-4b75-b27f-0bd492c60496

回答

只是澄清一下:

System.IO.Path.GetTempPath()

仅返回临时文件夹的文件夹路径。

System.IO.Path.GetTempFileName()

返回标准文件名(包括路径),因此:

System.IO.Path.Combine(System.IO.Path.GetTempPath(), System.IO.Path.GetTempFileName())

是多余的。

回答

在以下情况下可能存在比赛条件:

  • 使用" GetTempFileName()"创建一个临时文件,将其删除,并使用相同的名称创建一个文件夹,或者
  • 使用GetRandomFileName()或者Guid.NewGuid.ToString命名文件夹并稍后创建文件夹

使用删除后的GetTempFileName(),另一个应用程序可以成功创建一个具有相同名称的临时文件。然后,CreateDirectory()将失败。

类似地,在调用" GetRandomFileName()"和创建目录之间,另一个进程可能会创建一个具有相同名称的文件或者目录,从而再次导致" CreateDirectory()"失败。

对于大多数应用程序来说,临时目录由于竞争条件而失败是可以的。毕竟这是极为罕见的。对于他们而言,这些种族通常可以忽略。

在Unix shell脚本世界中,以一种安全的无竞争方式创建临时文件和目录是一件大事。许多计算机具有多个(敌对的)用户-想想共享的Web主机-并且许多脚本和应用程序需要在共享的/ tmp目录中安全地创建临时文件和目录。有关如何从Shell脚本安全地创建临时目录的讨论,请参见在Shell脚本中安全地创建临时文件。