首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何检查给定的字符串是否为Windows下的合法/有效文件名?

如何检查给定的字符串是否为Windows下的合法/有效文件名?
EN

Stack Overflow用户
提问于 2008-09-15 13:17:30
回答 19查看 176.6K关注 0票数 178

我想在我的应用程序中包含批处理文件重命名功能。用户可以输入目标文件名模式(在替换模式中的一些通配符之后),我需要检查它是否将是Windows下的合法文件名。我尝试过使用像[a-zA-Z0-9_]+这样的正则表达式,但它不包含来自各种语言的许多特定于国家的字符(例如变音等)。进行此类检查的最佳方式是什么?

EN

回答 19

Stack Overflow用户

发布于 2008-09-15 14:00:49

尝试使用它,并捕获错误。允许的设置可能会因文件系统或不同版本的Windows而有所不同。换句话说,如果你想知道Windows是否喜欢这个名字,就把名字交给它,然后让它告诉你。

票数 27
EN

Stack Overflow用户

发布于 2008-09-15 14:11:13

这是我使用的:

代码语言:javascript
复制
    public static bool IsValidFileName(this string expression, bool platformIndependent)
    {
        string sPattern = @"^(?!^(PRN|AUX|CLOCK\$|NUL|CON|COM\d|LPT\d|\..*)(\..+)?$)[^\x00-\x1f\\?*:\"";|/]+$";
        if (platformIndependent)
        {
           sPattern = @"^(([a-zA-Z]:|\\)\\)?(((\.)|(\.\.)|([^\\/:\*\?""\|<>\. ](([^\\/:\*\?""\|<>\. ])|([^\\/:\*\?""\|<>]*[^\\/:\*\?""\|<>\. ]))?))\\)*[^\\/:\*\?""\|<>\. ](([^\\/:\*\?""\|<>\. ])|([^\\/:\*\?""\|<>]*[^\\/:\*\?""\|<>\. ]))?$";
        }
        return (Regex.IsMatch(expression, sPattern, RegexOptions.CultureInvariant));
    }

第一种模式创建包含无效/非法文件名和字符的正则表达式,仅适用于Windows平台。第二个做同样的事情,但确保名称在任何平台上都是合法的。

票数 23
EN

Stack Overflow用户

发布于 2010-08-07 00:16:57

这个类清理文件名和路径;像这样使用它

代码语言:javascript
复制
var myCleanPath = PathSanitizer.SanitizeFilename(myBadPath, ' ');

这是代码;

代码语言:javascript
复制
/// <summary>
/// Cleans paths of invalid characters.
/// </summary>
public static class PathSanitizer
{
    /// <summary>
    /// The set of invalid filename characters, kept sorted for fast binary search
    /// </summary>
    private readonly static char[] invalidFilenameChars;
    /// <summary>
    /// The set of invalid path characters, kept sorted for fast binary search
    /// </summary>
    private readonly static char[] invalidPathChars;

    static PathSanitizer()
    {
        // set up the two arrays -- sorted once for speed.
        invalidFilenameChars = System.IO.Path.GetInvalidFileNameChars();
        invalidPathChars = System.IO.Path.GetInvalidPathChars();
        Array.Sort(invalidFilenameChars);
        Array.Sort(invalidPathChars);

    }

    /// <summary>
    /// Cleans a filename of invalid characters
    /// </summary>
    /// <param name="input">the string to clean</param>
    /// <param name="errorChar">the character which replaces bad characters</param>
    /// <returns></returns>
    public static string SanitizeFilename(string input, char errorChar)
    {
        return Sanitize(input, invalidFilenameChars, errorChar);
    }

    /// <summary>
    /// Cleans a path of invalid characters
    /// </summary>
    /// <param name="input">the string to clean</param>
    /// <param name="errorChar">the character which replaces bad characters</param>
    /// <returns></returns>
    public static string SanitizePath(string input, char errorChar)
    {
        return Sanitize(input, invalidPathChars, errorChar);
    }

    /// <summary>
    /// Cleans a string of invalid characters.
    /// </summary>
    /// <param name="input"></param>
    /// <param name="invalidChars"></param>
    /// <param name="errorChar"></param>
    /// <returns></returns>
    private static string Sanitize(string input, char[] invalidChars, char errorChar)
    {
        // null always sanitizes to null
        if (input == null) { return null; }
        StringBuilder result = new StringBuilder();
        foreach (var characterToTest in input)
        {
            // we binary search for the character in the invalid set. This should be lightning fast.
            if (Array.BinarySearch(invalidChars, characterToTest) >= 0)
            {
                // we found the character in the array of 
                result.Append(errorChar);
            }
            else
            {
                // the character was not found in invalid, so it is valid.
                result.Append(characterToTest);
            }
        }

        // we're done.
        return result.ToString();
    }

}
票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档