我正在尝试连接一些文件名组成部分,以确保如果我已经有一个同名文件,新文件将得到一个带下划线和递增计数器的新名称。
我写了以下我认为应该起作用的东西:
string tempPath = Path.Combine(Application.dataPath, "MyValues");
tempPath = Path.Combine(tempPath, "_");
tempPath = Path.Combine(tempPath, counter.ToString() + ".csv");
当我发现实际上没有文件被保存后,我加入了Debug.Log(tempPath)
来查看其返回的内容,令人惊讶的是,我得到了以下内容:
MyUnityProject/Assets\MyValues\_\0.csv
首先,为什么会有\
而不是/
?
此外,下划线周围的反斜杠来自哪里?
最后,不是手动删除它们,我如何找回正确的语法?例如MyValues_0.csv
,MyValues_1.csv
等...
答案 0 :(得分:2)
通过查看https://referencesource.microsoft.com/#mscorlib/system/io/path.cs,16ed6da326ce4745
处Path
类的源代码
我们可以看到方法Combine
为每对字符串路径调用方法CombineNoChecks
并返回以下内容:
return path1 + DirectorySeparatorCharAsString + path2;
DirectorySeparatorCharAsString
的值为:
internal const string DirectorySeparatorCharAsString = "\\";
该类中还定义了其他分隔符,因此您可以根据自己的运行平台获得正确的分隔符:
// Platform specific alternate directory separator character.
// This is backslash ('\') on Unix, and slash ('/') on Windows
// and MacOS.
public static readonly char AltDirectorySeparatorChar = '/';
因此,我不必担心该方法返回什么,它应该可以正常工作。
答案 1 :(得分:2)
\
或/
是否用于构建有效路径是why you even use Path.Combine
的全部原因:
您做什么
string tempPath = Path.Combine(Application.dataPath, "MyValues");
tempPath = Path.Combine(tempPath, "_");
tempPath = Path.Combine(tempPath, counter.ToString() + ".csv");
假设MyValue
和_
是文件夹名称。
Path.Combine
仅用于合并文件夹,而最终文件名不用于合并文件名本身。
您要做的是通过字符串连接构建完整的文件名,例如使用string.Format
string filename = string.Format("MyValues_{0}.csv", counter.ToString());
string filename = $"MyValues_{counter.ToString()}.csv";
这只是更简单的写作方式
string filename = "MyValues_" + counter.ToString() + ".csv";
,然后仅使用Path.Combine
将完整的文件名与给定的系统文件夹路径组合在一起,例如
string tempPath = Path.Combine(Application.dataPath, filename);