首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从任意字符串生成有效的Windows文件名?

如何从任意字符串生成有效的Windows文件名?
EN

Stack Overflow用户
提问于 2009-03-06 22:05:17
回答 11查看 45.3K关注 0票数 104

我有一个像"Foo: Bar“这样的字符串,我想将其用作文件名,但在Windows上,文件名中不允许使用":”字符。

有没有什么方法可以把"Foo: Bar“变成像"Foo- Bar”这样的东西?

EN

回答 11

Stack Overflow用户

发布于 2011-11-11 00:16:57

这并不是更高效,但更有趣:)

代码语言:javascript
复制
var fileName = "foo:bar";
var invalidChars = System.IO.Path.GetInvalidFileNameChars();
var cleanFileName = new string(fileName.Where(m => !invalidChars.Contains(m)).ToArray<char>());
票数 14
EN

Stack Overflow用户

发布于 2014-08-10 06:56:25

如果有人想要一个基于StringBuilder的优化版本,可以使用这个。将rkagerer's trick作为选项包括在内。

代码语言:javascript
复制
static char[] _invalids;

/// <summary>Replaces characters in <c>text</c> that are not allowed in 
/// file names with the specified replacement character.</summary>
/// <param name="text">Text to make into a valid filename. The same string is returned if it is valid already.</param>
/// <param name="replacement">Replacement character, or null to simply remove bad characters.</param>
/// <param name="fancy">Whether to replace quotes and slashes with the non-ASCII characters ” and ⁄.</param>
/// <returns>A string that can be used as a filename. If the output string would otherwise be empty, returns "_".</returns>
public static string MakeValidFileName(string text, char? replacement = '_', bool fancy = true)
{
    StringBuilder sb = new StringBuilder(text.Length);
    var invalids = _invalids ?? (_invalids = Path.GetInvalidFileNameChars());
    bool changed = false;
    for (int i = 0; i < text.Length; i++) {
        char c = text[i];
        if (invalids.Contains(c)) {
            changed = true;
            var repl = replacement ?? '\0';
            if (fancy) {
                if (c == '"')       repl = '”'; // U+201D right double quotation mark
                else if (c == '\'') repl = '’'; // U+2019 right single quotation mark
                else if (c == '/')  repl = '⁄'; // U+2044 fraction slash
            }
            if (repl != '\0')
                sb.Append(repl);
        } else
            sb.Append(c);
    }
    if (sb.Length == 0)
        return "_";
    return changed ? sb.ToString() : text;
}
票数 13
EN

Stack Overflow用户

发布于 2015-12-11 01:48:56

以下是使用Enumerable.AggregateLinq的一个接受答案版本

代码语言:javascript
复制
string fileName = "something";

Path.GetInvalidFileNameChars()
    .Aggregate(fileName, (current, c) => current.Replace(c, '_'));
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/620605

复制
相关文章

相似问题

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