Path.GetDirectoryName如何工作?

时间:2015-06-11 10:03:18

标签: c# path openfiledialog

当我使用OpenFileDialog打开文件时,我当然需要获取文件目录及其名称来加载文件。(加载xml ,要访问我需要完整路径的文件。)

opd OpenFileDialog

        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而且这个方法通过只取字符串来获取其目录? 。计算机内可能有数千个同名文件。

ShortQuestion: 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"

2 个答案:

答案 0 :(得分:3)

Path.GetDirectoryName将您已有的字符串(来自opd)用斜杠/\拆分,然后返回除最后一部分以外的所有内容。

.NET核心基础库(称为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

答案 1 :(得分:1)

  

name是Just string,这个方法只取字符串来获取它的目录? 。计算机内可能有数千个同名文件。

name包含完整路径,Path.GetDirectoryName()只删除最后一个目录分隔符之后的所有内容,Path.Combine(Path.GetDirectoryName(name), name) will not do anything useful

  

如果path2包含root,则返回path2。

直接使用name