创建临时文件夹
我正在开发一个程序,该程序需要为该应用程序创建多个临时文件夹。这些将不会被用户看到。该应用程序是用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脚本中安全地创建临时文件。