C#:什么是最快的方式来生成一个唯一的文件名?

我已经看到了随机命名文件的几个build议,包括使用

System.IO.Path.GetRandomFileName() 

或使用一个

 System.Guid 

并附加一个文件扩展名。

我的问题是: 什么是最快的方式来生成一个唯一的文件名?

一个GUID将是非常快的, 因为它的实现保证Windows可以在100纳秒的时间内产生至少16384个GUIDS 。 (正如其他人指出的那样,规范并不保证,只允许,但是,GUID的生成真的很快,真的是这样)。在任何网络上的任何文件系统上发生冲突的可能性非常低。 这是很安全的,虽然最好的做法是始终检查文件名是否可用,实际上,你甚至不需要这样做。

所以,除了自己保存以外,你不需要查看任何I / O操作,并且<0.2毫秒(在一个测试机器上)自己生成这个名字。 相当快。

你想要System.IO.Path.GetTempFileName()

实际上我不能说是否最快 ,但是这是正确的做法,这是更重要的。

那么我已经写了20年的文件系统驱动程序,并会说雷克斯是正确的。 生成一个GUID要快得多,因为它比搜索一个唯一的文件名要花费更少的开销。 GetTempFileName实际上创建一个文件,这意味着它必须通过整个文件系统驱动程序堆栈调用(谁知道将会有多少个调用并切换到内核模式。)GetRandomFileName听起来更快,但是我相信GUID调用甚至更快。 人们没有意识到,即使是测试文件的存在,也需要通过驱动程序堆栈进行完整的调用。 它实际上导致了一个打开,获取属性和关闭(至少有3个调用,这取决于水平)。实际上,它是至少20个函数调用和转换到内核模式。 GUIDS对于独特性的保证对于大多数目的来说是足够好的。

我的建议是生成名称,并创建该文件,如果它不存在。 如果是这样,抛出一个异常,并抓住它,然后生成一个新的GUID,然后再试一次。 这样,你没有错误的机会,晚上可以轻松入睡。

在一个侧面说明,检查错误是如此过头。 如果假设是错误的,代码应该被设计为崩溃,或者捕获异常并处理它。 在异常堆栈上推送和弹出地址要快得多,而不是每次检查每个函数的错误。

如果您控制文件所在的目标位置,并且只有一个进程和线程写入该文件,则只需将一些自动递增的数字附加到基本名称即可。

如果您不控制目标,或者需要多线程实现,请使用GUID。

如果你控制目录,你可以根据lastWriteTime命名你的文件:

 DirectoryInfo info = new DirectoryInfo(directoryPath); long uniqueKey = info.LastWriteTime.Ticks+1L; string filename = String.Format("file{0}.txt", key); 

但是你必须检查这个代码的性能:我猜建立一个DirectoryInfo不是免费的。

使用一个Int并为每个文件增加它。

就像是:

 file.MoveTo(deletedfilesdir + @"\" + f.Name + **DateTime.Now.ToFileTimeUtc()** + f.Extension);