C# URLEncode会用文件名(C)中的非法字符修复此问题吗?

C# URLEncode会用文件名(C)中的非法字符修复此问题吗?,c#,urlencode,illegal-characters,C#,Urlencode,Illegal Characters,我正在构建一个应用程序,它使用一个复杂的API从Youtube获取数据,数据文件以相应视频的名称作为文件名保存。然而,我的程序正在崩溃,因为YouTube上相当多的视频标题中的字符在Windows下的文件名中使用是非法的 对视频标题进行URL编码可以解决此问题吗 如果是这样,这是最好的方法吗?实现URLEncode的最好方法是什么 谢谢 如果您想进行url编码,可以使用。不过我不确定我会不会。它可能会去掉你想要的所有角色,但其他角色也一样 我想我可能会使用下划线来替换名称中任何无效的内容 当然,

我正在构建一个应用程序,它使用一个复杂的API从Youtube获取数据,数据文件以相应视频的名称作为文件名保存。然而,我的程序正在崩溃,因为YouTube上相当多的视频标题中的字符在Windows下的文件名中使用是非法的

对视频标题进行URL编码可以解决此问题吗

如果是这样,这是最好的方法吗?实现URLEncode的最好方法是什么


谢谢

如果您想进行url编码,可以使用。不过我不确定我会不会。它可能会去掉你想要的所有角色,但其他角色也一样

我想我可能会使用下划线来替换名称中任何无效的内容


当然,这不是一种可逆编码,但我认为它将生成更容易理解的文件名。您可能希望创建一个从原始标题映射到文件名的索引文件。

Url编码应该解决这个问题,因为它应该用“%”后跟一组十六进制替换任何无效字符和一些有效字符;据我所知,这对文件系统名称有效

但这引出了两个问题:

能够清晰地读取文件名对用户来说重要吗?如果不是,最好使用唯一的文件名1.file、2.file、3.file和文件名->标题的映射

如果两个视频名称相同,会发生什么情况?我想这是第一个问题的延伸

如果url编码时的标题比最大文件名长度长怎么办?如果我没记错的话,在NTFS上,文件名的最大长度是255个字符;如果一个标题中的每个字符扩展为3个字符用于url编码,则255个字符的限制可以通过85个字符的标题来满足


编辑/更新:UrlEncode认为某些字符有效,但这些字符是无效的文件系统字符;我特别遇到的一个是“\”。所以,不,Url编码是不安全的。

可以使用youtube的视频id而不是视频名称吗?e、 g.v=Yk6oPsKZG_w。或者你没有访问权限?这些似乎包含简单的字母数字,在youtube中应该是独一无二的

我不确定urlencode是否能帮助您在视频名称中添加星号

如果您仍然想使用视频名称,您可能希望使用\\?\前缀,它告诉Win32 API禁用所有字符串解析,并将此字符串直接发送到文件系统


我不确定您是否可以将其与.NET API一起使用,或者是否必须使用DllImport直接调用Win32 API。

我这样做时遇到了类似的问题:

    static string Escape(string input)
    {
        StringBuilder builder = new StringBuilder(input.Length);
        for (int i = 0; i < input.Length; i++)
        {
            if (Path.GetInvalidPathChars().Contains(input[i]) || Path.GetInvalidFileNameChars().Contains(input[i]) || input[i] == '%')
            {
                builder.Append(Uri.HexEscape(input[i]));
            }
            else
            {
                builder.Append(input[i]);
            }
        }
        return builder.ToString();
    }

    static string Unescape(string input)
    {
        StringBuilder builder = new StringBuilder(input.Length);
        int index = 0;
        while (index < input.Length)
        {
            builder.Append(Uri.HexUnescape(input, ref index));
        }
        return builder.ToString();
    }

编写所有这些代码感觉有点奇怪,但至少我得到了可以安全使用操作系统的可读文件名。

谢谢!我不知道有这样的事情存在!我将尝试一下,并报告它是否有效是的,我在考虑是否只使用唯一的文件名,但第二个问题实际上非常重要——我需要记住添加一些实现,以确保文件名不相同。谢谢