2010-01-04 30 views
2

我的应用需要在一天中将数千个文件复制/移动到一个目录。我需要确保当我复制这些文件时,我将它们重命名为该目录唯一的东西。如何将文件重命名为一个在C#中的傻瓜证明的唯一名称?

我对名称没有要求,除非他们明显需要唯一。

处理这个问题的正确方法是什么?我应该使用某种GUID,一些递增的数字还是其他方法?

我该如何在C#中执行此操作?

回答

11

您可以使用Path.GetRandomFileName

不过,我不认为生成的文件名都保证是唯一的(他们使用RNGCryptoServiceProvider产生的),所以做一个GUID可能是一个更好的主意

+3

因此,只是包装这是一个File.Exists()循环,以确保该文件不存在,如果没有,创建它? – Sinilax 2010-01-04 21:59:21

+0

是的,您可以检查具有相同名称的现有文件... – 2010-01-04 22:02:00

+1

File.Exists()的问题是它会导致竞争条件。只需将重命名进程放置在try-catch块中,并且如果抛出异常,那么只需重新执行即可。当一个文件已经存在时,你将不得不研究它是什么类型,因为我不记得我的头顶。 – Phong 2010-06-30 17:41:13

6

我倾向于使用

System.Guid.NewGuid().ToString() + ".jpg" 

时,唯一的要求是,他们绝对需要保证是唯一的。

这当然已经是您的想法之一,因此您首先想到的是+1。

+1

Guid.NewGuid(),不是NewId()。 – 2010-01-04 22:05:09

+0

谢谢@Kyralessa! – David 2010-01-04 22:08:45

0

您可以放心使用GUID的。他们是独一无二的,并且可以与

String filename = Guid.NewGuid().ToString() + ".MyExtension"; 

BR获取生成的文件名,马塞尔

+3

请注意,GUID不能保证是唯一的...生成相同GUID两次的概率很低 – 2010-01-04 22:03:54

+0

Thomas,您是对的。然而,可能性非常小,等待世界末日所需要的时间可能会比Guid类别中出现的非独特Guid要长。 :-) – Marcel 2010-01-05 07:44:03

+0

在任何情况下,我会检查文件是否存在,并将其放入循环中,并重复x。我知道这个概率很小,但它在那里,应该正确处理。 – 2010-01-19 20:31:40

0

如果需要新的文件名类似于旧的,你可以使用此解决方案:

string oldFileName = @"c:\old\oldfile.txt"; 
string newFileName = oldFileName.Substring(0, oldFileName.LastIndexOf('.')) + "-"; 
string oldFileNameExtension = oldFileName.Substring(oldFileName.LastIndexOf('.')+1); 
File.Move(oldFileName, newFileName + DateTime.Now.Ticks.ToString() + oldFileNameExtension); 

DateTime.Ticks是一个Long类型的整数,其中包含转换为纳秒的当前日期。注意:在Ticks计数器高级之前,大多数CPU可以执行许多操作。

如果您一次执行多个文件,您将不得不添加一个while(File.Exists())循环,其中包含Thread.Sleep(10);。或者如果你不想用Thread.Sleep减慢它,你可以在循环中添加一个计数器并将其附加到newFileName的末尾。

相关问题