详解C# 不能用于文件名的字符

作者:mrr 时间:2023-03-05 07:44:45 

在 Windows 有一些字符是不能作为文件名,尝试重命名一个文件,输入/ 就可以看到windows 提示的不能作为文件名的字符

详解C# 不能用于文件名的字符

那么具体是包括哪些符号不能作为文件名?

  • Tilde (~)

  • Number sign (#)

  • Percent (%)

  • Ampersand (&)

  • Asterisk (*)

  • Braces ({ })

  • Backslash (\)

  • Colon (:)

  • Angle brackets (< >)

  • Question mark (?)

  • Slash (/)

  • Plus sign (+)

  • Pipe (|)

  • Quotation mark (")

上面这些字符不能用来文件名和文件夹名

而且在 windows 的要求,文件是需要有文件名的,虽然你也可以创建.file这样的文件,但是用户是难以自己输入这样的文件名。

之外还有一些文件名是保留,不能创建这样的文件名


CON, PRN, AUX, CLOCK$, NUL
COM0, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9
LPT0, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9.

尝试新建一个文本,然后把他文件名命名为上面的任意一个,基本windows会说不能把文件命名

那么是不是把这些字符串拿出来判断?实际上微软已经做了这个了,因为在不同的系统,可能之后会添加新的字符串,所以最好不要自己写。

可以使用微软给的函数System.IO.Path.GetInvalidFileNameChars ,下面的代码可以直接使用


public static string MakeValidFileName(string text, string replacement = "_")
 {
  StringBuilder str=new StringBuilder();
  var invalidFileNameChars = System.IO.Path.GetInvalidFileNameChars();
  foreach (var c in text)
  {
   if (invalidFileNameChars.Contains(c))
   {
    str.Append(replacement??"");
   }
   else
   {
    str.Append(c);
   }
  }
  return str.ToString();
 }

如果确实需要显示文件名,请使用下面代码


public static string GetSafeFilename(string arbitraryString)
{
var invalidChars = System.IO.Path.GetInvalidFileNameChars();
var replaceIndex = arbitraryString.IndexOfAny(invalidChars, 0);
if (replaceIndex == -1) return arbitraryString;
var r = new StringBuilder();
var i = 0;
do
{
 r.Append(arbitraryString, i, replaceIndex - i);
 switch (arbitraryString[replaceIndex])
 {
  case '"':
   r.Append("''");
   break;
  case '<':
   r.Append('\u02c2'); // '˂' (modifier letter left arrowhead)
   break;
  case '>':
   r.Append('\u02c3'); // '˃' (modifier letter right arrowhead)
   break;
  case '|':
   r.Append('\u2223'); // '∣' (divides)
   break;
  case ':':
   r.Append('-');
   break;
  case '*':
   r.Append('\u2217'); // '∗' (asterisk operator)
   break;
  case '\\':
  case '/':
   r.Append('\u2044'); // '⁄' (fraction slash)
   break;
  case '\0':
  case '\f':
  case '?':
   break;
  case '\t':
  case '\n':
  case '\r':
  case '\v':
   r.Append(' ');
   break;
  default:
   r.Append('_');
   break;
 }
 i = replaceIndex + 1;
 replaceIndex = arbitraryString.IndexOfAny(invalidChars, i);
} while (replaceIndex != -1);
r.Append(arbitraryString, i, arbitraryString.Length - i);
return r.ToString();
}

总结

以上所述是小编给大家介绍的C# 不能用于文件名的字符网站的支持!

来源:https://lindexi.oschina.io/lindexi/post/C-%E4%B8%8D%E8%83%BD%E7%94%A8%E4%BA%8E%E6%96%87%E4%BB%B6%E5%90%8D%E7%9A%84%E5%AD%97%E7%AC%A6.html

标签:C#,文件名,字符
0
投稿

猜你喜欢

  • 200行java代码实现2048小游戏

    2023-11-29 12:03:57
  • Kotlin与java8的SAM转换对比(进阶)

    2023-05-15 11:50:35
  • Java内置GUI Frame类的使用

    2021-10-25 18:06:49
  • Flutter开发Widgets 之 PageView使用示例

    2023-06-24 13:23:34
  • 详解C# Protobuf如何做到0分配内存的序列化

    2021-11-26 01:09:11
  • Java的引用类型常用的四种方法

    2023-11-29 14:05:24
  • Ribbon单独使用,配置自动重试,实现负载均衡和高可用方式

    2023-05-12 00:49:15
  • Android自定义样式圆角dialog对话框

    2023-11-04 20:34:10
  • 【java 多线程】守护线程与非守护线程的详解

    2023-11-29 01:35:29
  • JDK8中新增的原子性操作类LongAdder详解

    2023-06-19 22:02:58
  • 在IDEA里gradle配置和使用的方法步骤

    2023-11-23 16:07:58
  • 如何解决Java多线程死锁问题

    2022-08-11 15:51:02
  • 解决jmap命令打印JVM堆信息异常的问题

    2023-11-05 09:07:02
  • C#实现简单文本编辑器

    2022-04-28 06:42:30
  • Java I/O 操作及优化详细介绍

    2022-07-30 14:46:42
  • Java重点梳理类与对象核心原理

    2023-04-08 06:15:41
  • Springboot中加入druid连接池

    2023-08-08 05:47:22
  • Java8中forEach语句循环一个List和Map

    2021-06-02 07:03:54
  • 浅析JAVA中过滤器、监听器、拦截器的区别

    2023-10-18 17:47:24
  • Java基于ArrayList实现群主发红包功能

    2022-04-06 20:34:09
  • asp之家 软件编程 m.aspxhome.com