Path.GetDirectoryName 的工作原理
本文关键字:工作 GetDirectoryName Path | 更新日期: 2023-09-27 17:55:40
当我使用 OpenFileDialog
打开文件时,我当然需要获取文件目录及其名称来加载文件。要加载XML,要访问文件,我需要完整路径。
opd
是打开文件对话框
if (opd.ShowDialog() == true)
{
var names = opd.FileNames;
foreach (string name in names)
{
LoadFile(Path.Combine(Path.GetDirectoryName(name), name));
}
}
我的问题是Path.GetDirectoryName
如何通过仅获取字符串来获取文件的路径?
Path.GetDirectoryName(name)
name
只是string
,此方法仅通过获取字符串来获取其目录?。 计算机中可能有数千个同名文件。
简短问题:opd
指在哪里?
编辑:
我以为opd.FileNames
只是取文件名。(因为方法名称)
我还发现了一些有趣的东西。
LoadFile(Path.Combine(Path.GetDirectoryName(name), name));
这工作正常,因为Path.Combine
只会跳过字符串的同一部分。
前任:
string name = @"C:'Users'Default'xml.xml";
string getDirNameResault= Path.GetDirectoryName(name);// this will be C:'Users'Default
所以 Path.Combine 将是
Path.Combine(@"C:'Users'Default", @"C:'Users'Default'xml.xml)
女巫回来"C:'Users'Default'xml.xml"
!
Path.GetDirectoryName
通过斜杠/
或'
拆分您已有的字符串(从opd
),然后返回除最后一部分之外的所有内容。
可在此处找到 .NET Core 基础库(称为 CoreFX)中函数的完整源代码:https://github.com/dotnet/corefx/blob/41e203011152581a6c65bb81ac44ec037140c1bb/src/System.Runtime.Extensions/src/System/IO/Path.cs#L151
实现代码:
// Returns the directory path of a file path. This method effectively
// removes the last element of the given file path, i.e. it returns a
// string consisting of all characters up to but not including the last
// backslash ("'") in the file path. The returned value is null if the file
// path is null or if the file path denotes a root (such as "'", "C:", or
// "''server'share").
//
public static String GetDirectoryName(String path)
{
if (path != null)
{
CheckInvalidPathChars(path);
#if FEATURE_LEGACYNETCF
if (!CompatibilitySwitches.IsAppEarlierThanWindowsPhone8)
{
#endif
string normalizedPath = NormalizePath(path, false);
// If there are no permissions for PathDiscovery to this path, we should NOT expand the short paths
// as this would leak information about paths to which the user would not have access to.
if (path.Length > 0)
{
try
{
// If we were passed in a path with ''?' we need to remove it as FileIOPermission does not like it.
string tempPath = Path.RemoveLongPathPrefix(path);
// FileIOPermission cannot handle paths that contain ? or *
// So we only pass to FileIOPermission the text up to them.
int pos = 0;
while (pos < tempPath.Length && (tempPath[pos] != '?' && tempPath[pos] != '*'))
pos++;
// GetFullPath will Demand that we have the PathDiscovery FileIOPermission and thus throw
// SecurityException if we don't.
// While we don't use the result of this call we are using it as a consistent way of
// doing the security checks.
if (pos > 0)
Path.GetFullPath(tempPath.Substring(0, pos));
}
catch (SecurityException)
{
// If the user did not have permissions to the path, make sure that we don't leak expanded short paths
// Only re-normalize if the original path had a ~ in it.
if (path.IndexOf("~", StringComparison.Ordinal) != -1)
{
normalizedPath = NormalizePath(path, /*fullCheck*/ false, /*expandShortPaths*/ false);
}
}
catch (PathTooLongException) { }
catch (NotSupportedException) { } // Security can throw this on "c:'foo:"
catch (IOException) { }
catch (ArgumentException) { } // The normalizePath with fullCheck will throw this for file: and http:
}
path = normalizedPath;
#if FEATURE_LEGACYNETCF
}
#endif
int root = GetRootLength(path);
int i = path.Length;
if (i > root)
{
i = path.Length;
if (i == root) return null;
while (i > root && path[--i] != DirectorySeparatorChar && path[i] != AltDirectorySeparatorChar) ;
String dir = path.Substring(0, i);
#if FEATURE_LEGACYNETCF
if (CompatibilitySwitches.IsAppEarlierThanWindowsPhone8)
{
if (dir.Length >= MAX_PATH - 1)
throw new PathTooLongException(Environment.GetResourceString("IO.PathTooLong"));
}
#endif
return dir;
}
}
return null;
}
有关该函数的完整源代码(单声道),请参见此处:https://github.com/mono/mono/blob/master/mcs/class/corlib/System.IO/Path.cs#L199
name 是 Just string,此方法通过获取字符串来获取其目录?。 计算机中可能有数千个同名文件。
name
包含完整路径,Path.GetDirectoryName()
只是去除最后一个目录分隔符之后的所有内容,Path.Combine(Path.GetDirectoryName(name), name)
不会做任何有用的事情:
如果路径 2包含根,则返回路径 2。
只需直接使用name
即可。