C# 如何为文件名添加第二个扩展名?
我想创建一个数据文件,但在写入最终文件之前,我想将其放到一个临时位置,以避免用户混淆。作为一个例子,我可以从C# 如何为文件名添加第二个扩展名?,c#,filenames,C#,Filenames,我想创建一个数据文件,但在写入最终文件之前,我想将其放到一个临时位置,以避免用户混淆。作为一个例子,我可以从test.txt开始,并希望使用test.txt.tmp。名称可以包含路径,但文件可能不一定存在(因此这个问题纯粹是关于字符串操作) 我最近使用的是Path.ChangeExtension: string original = "test.txt"; string temp = Path.ChangeExtension(original, "tmp"); 但是它会返回test.tmp。所
test.txt
开始,并希望使用test.txt.tmp
。名称可以包含路径,但文件可能不一定存在(因此这个问题纯粹是关于字符串操作)
我最近使用的是Path.ChangeExtension
:
string original = "test.txt";
string temp = Path.ChangeExtension(original, "tmp");
但是它会返回
test.tmp
。所以我的问题是,是否有一个内置的方法来实现“双扩展名”文件名?我可以一直使用脑死字符串连接,但我正在寻找一种更安全、更可靠的方法。为什么不能像这样附加该字符串
if(!string.IsNullOrEmpty(Path.GetExtension(original)){
original+= ".tmp";
}
如果要使用临时文件,可以使用 或者在您的情况下:
string original = "test.txt";
string temp = "test.txt" + ".tmp";
您应该使用并重命名扩展名
string path = Path.GetTempFileName();
// some logic on the file then rename the file and move it when you need it
string fileName = Path.GetFileName(path);
File.Move(path, path.Replace(fileName, "test.txt"));
避免陷阱对于
Path.combined
之类的东西是一个好主意,例如,因为您不想麻烦检查是否缺少\
字符
但这里没有陷阱
- 如果您的原始文件名和您期望的一样,那么字符串连接将起作用
- 如果您的原始文件名不是您所期望的,那么问题在于提供错误文件名的人。“大便进去,大便出来”并不是你内在逻辑应该担心的事情。算法的正确性取决于它接收到的信息李>
对亚历山德罗·安德里亚的建议特别呼喊:
Path.ChangeExtension(original, Path.GetExtension(original) + ".tmp");
从技术上讲,它采用Path
逻辑,因此符合您的标准。我真的很喜欢遵循你的期望的聪明
然而,这样做毫无好处。就其本质而言,扩展名被定义为“文件名的最后一部分”
无论您是执行直接字符串连接,还是执行以下操作:
- 将字符串切成两段(文件名、扩展名)
- 将某物附加到最后一块(扩展+临时扩展)
- 把所有东西再粘在一起
最终结果总是一样的。切碎字符串是不必要的工作。请记住
Path.GetTempFileName()代码>实际上创建了一个文件-所以在完成后一定要删除它。为什么不string temp=original+“.tmp”
@mjwills我希望尽可能使用内置方法避免任何不必要的陷阱。原因与to差不多。为什么不使用Path.ChangeExtension(original,Path.GetExtension(original)+“.tmp”)代码>?。@Alejandro:避免陷阱对于Path.Combine
之类的东西来说是个好主意。但是这里没有陷阱(比如未知的“``存在)。若您的原始文件名并不像您期望的那个样,那个么您将在这个小逻辑之前遇到这个问题。字符串连接在这里是完全可以接受的。@AlessandroD'Andria:虽然我很欣赏你的建议,在技术上遵守Path
逻辑的用法,但扩展名的固有定义意味着它是文件名的结束位。您的建议将始终等同于执行简单的连接,但会有性能差异,因为您要采取更多步骤来获得相同的结果。@如果没有其他任何方法,Flater也许“字符串连接是最好的方法”是我完全可以接受的答案。我的问题更多的是寻找内在的东西,但答案可能是“没有这样的东西”。你能把这个推理作为一个完整的答案吗?但是对于一个人来说,它在系统临时文件夹中创建了一个文件,并且没有达到我的双扩展名要求。你为什么需要双扩展名?如果在写入最终文件之前使用临时文件,用户将无法访问该文件(如果用于桌面应用程序)。我希望将其写入最终目标文件夹。保存到temp,然后移动可能会面临权限和磁盘空间问题,而同一文件夹将在尽可能早的时间被检测到。因此,我选择的解决方案是在编写时将其命名为test.txt.tmp
,完成后重命名为test.txt
。同时,用户将无法使用该文件(至少,不需要简单的双击)。严格地说,任何其他命名都可以,但由于它是用户选择的位置,我想让它尽可能清楚。
Path.ChangeExtension(original, Path.GetExtension(original) + ".tmp");