windows的默认编码和linux是不一样的,查查看你的linux系统的默认编码是什么
文件内容是可以的 就是文件的名称是中文的读取不到
读取不到路径
@UP技术控: 你好,可以先试试把文件名换成个简单的英文的,看看能否读取到。
如果能读取的话,就是中文文件名编码的问题,
如果读取不到,那就是路径有可能不对。比如linux在文件夹的分割符(/)和windows()是反着的.
@wang_yb: 英文可以 你是说 比如windows 是 张三.txt linux 可能是 xxx.txt 这样吗
@UP技术控: 是的,我是想先排除下看看是不是系统编码的问题
@wang_yb: 英文正常 中文不行 这样是改linux系统 还是代码
@UP技术控: 用 locale 命令看看系统支持的编码
把utf8 编码的支持安装上
@wang_yb:
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
[root@iZbp190fxt8aq4r5wrn9ekZ ~]# ^C
[root@iZbp190fxt8aq4r5wrn9ekZ ~]#
@UP技术控: 这个编码应该是支持中文的。读文件的代码片段能看看不
@wang_yb:
string applicationRoot = AppContext.BaseDirectory;
if (!File.Exists(AppContext.BaseDirectory + @"啊.txt"))
{
throw new CustomException(AppContext.BaseDirectory + @"/啊.txt", ReturnCode.E1000003);
}
@wang_yb: {
"code": 1000003,
"message": "/NetCoreDemo/publish//啊.txt",
"data": null,
"success": false
}
@UP技术控: 这个 message 中路径好像多个 / , //啊.txt
@wang_yb: if (!File.Exists(AppContext.BaseDirectory + @"啊.txt")) 判断在这 是 没有的
@UP技术控:
修改编码:
vi /etc/profile
export LC_ALL="zh_CN.GBK"
export LANG="zh_CN.GBK"
让修改生效:source /etc/profile
修改这个中文编码试试看呢
@wang_yb: # locale
LANG=zh_CN.GBK
LC_CTYPE="zh_CN.GBK"
LC_NUMERIC="zh_CN.GBK"
LC_TIME="zh_CN.GBK"
LC_COLLATE="zh_CN.GBK"
LC_MONETARY="zh_CN.GBK"
LC_MESSAGES="zh_CN.GBK"
LC_PAPER="zh_CN.GBK"
LC_NAME="zh_CN.GBK"
LC_ADDRESS="zh_CN.GBK"
LC_TELEPHONE="zh_CN.GBK"
LC_MEASUREMENT="zh_CN.GBK"
LC_IDENTIFICATION="zh_CN.GBK"
LC_ALL=
还是不行
@UP技术控:
Path.Combine()
,你可以试一下,windows 和 centos 都没有问题
var basePath = Path.Combine(env.ContentRootPath ?? env.WebRootPath, "excels");
if (!Directory.Exists(basePath))
{
Directory.CreateDirectory(basePath);
}
var path = Path.Combine(basePath, record.FileName);
await using (var stream = new FileStream(path, FileMode.CreateNew))
{
await stream.WriteAsync(bytes.AsMemory(0, bytes.Length));
}
我这里在 linux 上用控制台程序测试是可以的
$ locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
用的是 ubuntu 18.04
我这边是阿里云的 CentOS 8.5 64位 现在是读取一个文件 内容是 没问题 主要是路径包含中文的话就无法识别文件的存在 net6 版本的
在xshell是没问题的 命令是可以找到的
[root@xxxx publish]# cd /NetCoreDemo/publish/啊
[root@xxx 啊]# cd /NetCoreDemo/publish/啊
[root@xxx 啊]#
DirectoryInfo FileInfo 都找不到中文路径 在代码把路径打印出来 再去xshell 使用也是可行的
比如在根目录加个文件夹 /啊
var dirInfo = new DirectoryInfo(Path.Combine(applicationRoot,"啊"));
if (!dirInfo.Exists)
throw new CustomException("111111111", ReturnCode.E1000003);
输出是 throw new CustomException("111111111", ReturnCode.E1000003);
@UP技术控: 是控制台程序还需 ASP.NET Core 程序?
@dudu: ASP.NET Core 程序
@dudu: 我现在系统切成 ubuntu 18.04 也是一样 尴尬
@UP技术控: 我用 ASP.NET Core 试试
@dudu: 我现在 系统环境和字符集设置和你是一样的
字符集
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
代码
using System.Text;
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
Console.WriteLine(Encoding.GetEncoding("GB2312"));
Console.OutputEncoding = Encoding.GetEncoding("GB2312");
Console.WriteLine("您好,北京欢迎你");
string applicationRoot = AppContext.BaseDirectory;
var dirInfo = new DirectoryInfo(Path.Combine(applicationRoot, "啊"));
if (!dirInfo.Exists)
Console.WriteLine(Path.Combine(applicationRoot, "啊"));
输出
System.Text.DBCSCodePageEncoding
您好,北京欢迎你
/NetCoreDemo/publish/啊
Hello, World111111111111111111111111!
也是没法识别中文路径
/NetCoreDemo/publish/啊 这个文件夹是存在的
@UP技术控: 我这里测试没问题
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
}
public IActionResult Index()
{
var path = AppContext.BaseDirectory + @"博客园博问.txt";
Console.WriteLine(path);
var existence = System.IO.File.Exists(path);
Console.WriteLine(existence);
return Ok(existence);
}
}
@dudu: 我现在是完全干净的系统 完全干净的demo 加上
这段
var path = AppContext.BaseDirectory + @"博客园博问.txt";
Console.WriteLine(path);
var existence = System.IO.File.Exists(path);
Console.WriteLine(existence);
一样是不行 放弃
感谢帮助
看一下源代码文件(也就是 Program.cs 之类的)的编码呢,如果是 GBK 的建议先转成 UTF8 试试。