当前位置:  开发笔记 > 编程语言 > 正文

在C#中检查文件名是*可能*有效(不是它存在)

如何解决《在C#中检查文件名是*可能*有效(不是它存在)》经验,为你挑选了6个好方法。

System.IO命名空间中是否有一个检查文件名有效性的方法?

例如,C:\foo\bar将验证,:"~-*不会

或者有点棘手,X:\foo\bar会验证系统上是否有X:驱动器,否则不会.

我想我自己可以编写这样的方法,但我对内置的方法更感兴趣.



1> mmmmmmmm..:

做就是了;

System.IO.FileInfo fi = null;
try {
  fi = new System.IO.FileInfo(fileName);
}
catch (ArgumentException) { }
catch (System.IO.PathTooLongException) { }
catch (NotSupportedException) { }
if (ReferenceEquals(fi, null)) {
  // file name is not valid
} else {
  // file name is valid... May check for existence by calling fi.Exists.
}

对于创建FileInfo实例,文件不需要存在.


小心FileInfo.任何字符串,即使它只是一个字母是构造函数中的有效参数,但只是尝试新的FileInfo(pathTheuserEntered)将导致FileInfo假定该文件是相对于当前工作目录的,这可能不是您想要的.
这不会捕获包含'/'的文件名,该文件名无效.

2> Eugene Katz..:

您可以从Path.GetInvalidPathChars和GetInvalidFileNameChars中获取无效字符列表,如本问题中所述.

正如jberger所指出的,还有一些其他字符未包含在此方法的响应中.有关Windows平台的更多详细信息,请查看MSDN 上的命名文件,路径和命名空间,

正如Micah 指出的那样,有Directory.GetLogicalDrives来获取有效驱动器的列表.


"从此方法返回的数组不保证包含在文件和目录名称中无效的**完整**字符集." [备注](http://msdn.microsoft.com/en-us/library/system.io.path.getinvalidfilenamechars.aspx)

3> LamdaComplex..:

您可以使用System.Uri类.Uri类不仅对Web URL有用,它还处理文件系统路径.使用Uri.TryCreate方法查找路径是否为root,然后使用IsLoopback属性确定Uri是否引用本地计算机.

这是一个简单的方法,用于确定字符串是否为有效,本地和根文件路径.

public bool IsPathValidRootedLocal(String pathString) {
    Uri pathUri;
    Boolean isValidUri = Uri.TryCreate(pathString, UriKind.Absolute, out pathUri);
    return isValidUri && pathUri != null && pathUri.IsLoopback;
}

我相信这会奏效.



4> Micah..:

您可以使用System.IO命名空间中存在的几种方法:

Directory.GetLogicalDrives() // Returns an array of strings like "c:\"
Path.GetInvalidFileNameChars() // Returns an array of characters that cannot be used in a file name
Path.GetInvalidPathChars() // Returns an array of characters that cannot be used in a path.

如建议您可以这样做:

bool IsValidFilename(string testName) {
    string regexString = "[" + Regex.Escape(Path.GetInvalidPathChars()) + "]";
    Regex containsABadCharacter = new Regex(regexString);
    if (containsABadCharacter.IsMatch(testName)) {
        return false;
    }

    // Check for drive
    string pathRoot = Path.GetPathRoot(testName);
    if (Directory.GetLogicalDrives().Contains(pathRoot)) {
        // etc
    }

    // other checks for UNC, drive-path format, etc

    return true;
}


不打算投票,但你真的应该在使用其他人的示例代码时给予信任,特别是当它不是真的正确时.http://stackoverflow.com/questions/62771/how-check-if-given-string-is-legal-allowed-file-name-under-windows#62855
"regexString"看起来应该更像:string regexStringPath ="["+ Regex.Escape(new string(System.IO.Path.GetInvalidPathChars()))+"]";

5> Michael Hare..:

即使文件名有效,您仍可能希望touch确保用户具有写入权限.

如果你不会在短时间内用数百个文件颠倒磁盘,我认为创建一个空文件是一种合理的方法.

如果你真的想要更轻松的东西,比如检查无效的字符,那么将你的文件名与Path.GetInvalidFileNameChars()进行比较.



6> 小智..:

我想我会发布一个解决方案,该解决方案是我在寻找针对同一问题的可靠解决方案之后找到的答案的一部分。希望它可以帮助其他人。

using System;
using System.IO;
//..

public static bool ValidateFilePath(string path, bool RequireDirectory, bool IncludeFileName, bool RequireFileName = false)
{
    if (string.IsNullOrEmpty(path)) { return false; }
    string root = null;
    string directory = null;
    string filename = null;
    try
    {
        // throw ArgumentException - The path parameter contains invalid characters, is empty, or contains only white spaces.
        root = Path.GetPathRoot(path);

        // throw ArgumentException - path contains one or more of the invalid characters defined in GetInvalidPathChars.
        // -or- String.Empty was passed to path.
        directory = Path.GetDirectoryName(path);

        // path contains one or more of the invalid characters defined in GetInvalidPathChars
        if (IncludeFileName) { filename = Path.GetFileName(path); }
    }
    catch (ArgumentException)
    {
        return false;
    }

    // null if path is null, or an empty string if path does not contain root directory information
    if (String.IsNullOrEmpty(root)) { return false; }

    // null if path denotes a root directory or is null. Returns String.Empty if path does not contain directory information
    if (String.IsNullOrEmpty(directory)) { return false; }

    if (RequireFileName)
    {
        // if the last character of path is a directory or volume separator character, this method returns String.Empty
        if (String.IsNullOrEmpty(filename)) { return false; }

        // check for illegal chars in filename
        if (filename.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0) { return false; }
    }
    return true;
}

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有