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");