为什么函数输出错误值?

时间:2014-09-21 21:32:21

标签: c# io

我编写的Function以检查是否存在File/Directory路径,并且RecentPath检索Function检查的最后一条路径

    private static String IRecentPath;
    public static String RecentPath
    {
        get
        {
            return IRecentPath;
        }
    }

    public static Boolean Exists(String Path, Int32 PathType = 0)
    {
        return Exist(Path, PathType);
    }

    internal static Boolean Exist(String Path, Int32 PathType = 0)
    {
        Boolean Report = false;
        switch (PathType)
        {
            case 0:
                Report = (Directory.Exists(Path) || File.Exists(Path));
                IRecentPath = Path;
                break;
            case 1:
                String MPath = AppDomain.CurrentDomain.BaseDirectory;
                Report = (Directory.Exists(System.IO.Path.Combine(MPath, Path)) || File.Exists(System.IO.Path.Combine(MPath, Path)));
                IRecentPath = System.IO.Path.Combine(MPath, Path);
                break;
            case 2:
                String LPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
                Report = (Directory.Exists(System.IO.Path.Combine(LPath, Path)) || File.Exists(System.IO.Path.Combine(LPath, Path)));
                IRecentPath = System.IO.Path.Combine(LPath, Path);
                break;
            default:
                break;
        }
        return Report;
    }

问题是RecentPath总是检索调用函数时设置的路径,而不是最终路径。

示例:

假设我需要检查/user中是否存在myDocument目录,然后获取最近检查过的路径,所以:

Path.Exists("/user", 2);
MessageBox.Show(Path.RecentPath);

输出应该是C:\Users\Hossam\Documents\user\,而只是/user

2 个答案:

答案 0 :(得分:3)

输入字符串开头的斜杠(/)显然会干扰Path.Combine()。试试这个:

Path.Exists("user", 2);
MessageBox.Show(Path.RecentPath);

输出:C:\Users\Hossam\Documents\user

答案 1 :(得分:3)

这是因为您传递了一个以正斜杠开头的字符串 在Windows系统中,这是AltDirectorySeparatorChar

Path.Combine文档中,您可以阅读此评论

  

如果path2不包含根(例如,如果path2未启动)   使用分隔符或驱动器规范),结果是a   这两条路径的连接,带有插入分隔符   字符。 如果path2包含root,则返回path2。

现在查看Path.Combine的源代码,你可以看到

.....
if (IsPathRooted(path2))
{
    return path2;
}
....

当然IsPathRooted包含

.....
if (path[0] == AltDirectorySeparatorChar)
{
    return true;
}
.....