C# 如何使用非法名称保存文件

C# 如何使用非法名称保存文件,c#,C#,以下是我创建文件的方式: System.IO.File.Create(Server.MapPath("..") + name + ".html"); 但有时这个名字有非法字符,比如瑞典字母表中的å。如何拯救他们?可以直接使用,但使用代码时会出错。如果路径由用户控制,并且可能包含无效的文件系统字符,则需要请求用户更改名称或以确定的方式规范化坏字符。一种方法是用下划线替换所有无效字符 public static string NormalizeFileName(string input) {

以下是我创建文件的方式:

System.IO.File.Create(Server.MapPath("..") + name + ".html");

但有时这个名字有非法字符,比如瑞典字母表中的å。如何拯救他们?可以直接使用,但使用代码时会出错。

如果路径由用户控制,并且可能包含无效的文件系统字符,则需要请求用户更改名称或以确定的方式规范化坏字符。一种方法是用下划线替换所有无效字符

public static string NormalizeFileName(string input) {
  var invalid = Path.GetInvalidPathChars();
  var builder = new System.Text.StringBuilder();
  foreach(char c in input) {
    if (invalid.Contains(c)) {
      builder.Append('_');
    } else {
      builder.Append(c);
    }
  }
  return builder.ToString();
}
然后可以按如下方式使用此函数

var originalName = Server.MapPath("..") + name + ".html";
var normalizedName = NormalizeFileName(originalName);
System.IO.File.Create(normalizedName);
编辑

正如一些人指出的那样,最好在这里使用
Path.Combine
来组合目录名和文件名

var originalName = Path.Combine(Server.MapPath(".."), name + ".html");

如果路径由用户控制,并且可能包含无效的文件系统字符,则需要要求用户更改名称或以确定的方式规范化坏字符。一种方法是用下划线替换所有无效字符

public static string NormalizeFileName(string input) {
  var invalid = Path.GetInvalidPathChars();
  var builder = new System.Text.StringBuilder();
  foreach(char c in input) {
    if (invalid.Contains(c)) {
      builder.Append('_');
    } else {
      builder.Append(c);
    }
  }
  return builder.ToString();
}
然后可以按如下方式使用此函数

var originalName = Server.MapPath("..") + name + ".html";
var normalizedName = NormalizeFileName(originalName);
System.IO.File.Create(normalizedName);
编辑

正如一些人指出的那样,最好在这里使用
Path.Combine
来组合目录名和文件名

var originalName = Path.Combine(Server.MapPath(".."), name + ".html");

å
是Windows 7上文件名中的有效字符。你在说什么?你犯了什么错误?你能发布你得到的异常的确切消息和堆栈跟踪吗?此外,name变量的确切值。可能的重复项不应让用户决定保存在服务器文件系统上的文件的名称。而是使用唯一的id并存储从用户指定的名称到id的映射,例如在DB
å
中,Windows 7上的文件名中的有效字符。你在说什么?你犯了什么错误?你能发布你得到的异常的确切消息和堆栈跟踪吗?此外,name变量的确切值。可能的重复项不应让用户决定保存在服务器文件系统上的文件的名称。相反,使用一个唯一的id并存储从用户指定的名称到id的映射,例如,在数据库中,如果他使用
Path.Combine(Server.MapPath(“…”)、Path.ChangeExtension(NormalizeFileName(name),“.html”)
,可能会修复一些角落情况,如果他使用
Path.Combine(Server.MapPath(“…”)、Path.ChangeExtension(NormalizeFileName(名称),“.html”)