在并行运行的方法中使用Path.GetFileName()
或Path.GetFileNameWithoutExtension()
是否安全?
例如:
我有以下
var test = files.AsParallel().Select(x => this.MatchFileDirectory(x, dirs));
和MatchFileDirectory
内部我会打电话给Path.GetFileName()
。性能有任何缺点吗?
答案 0 :(得分:2)
不,在Task
内使用它没有任何缺点。除非您可能期望,它甚至不进行任何磁盘IO操作,它只是一个没有任何外部需求的全.NET方法。所以无需担心。
查看source:
public static String GetFileName(String path) {
if (path != null) {
CheckInvalidPathChars(path);
int length = path.Length;
for (int i = length; --i >= 0;) {
char ch = path[i];
if (ch == DirectorySeparatorChar || ch == AltDirectorySeparatorChar || ch == VolumeSeparatorChar)
return path.Substring(i + 1, length - i - 1);
}
}
return path;
}
答案 1 :(得分:1)
在这种情况下,您完全安全 - 您传递给方法的字符串内容是不可变的,因此无法更改,Path.GetFileName()
方法调用是确定性的并且没有副作用:
Path类的大多数成员不与文件系统交互,也不验证路径字符串指定的文件是否存在。修改路径字符串的路径类成员(如ChangeExtension)不会影响文件系统中的文件名。