首页 新闻 会员 周边 捐助

net core 部署在linux 读取文件 其中文件名称是中文的 在windows 是 可以 在linux 不行

0
[待解决问题]

net core 部署在linux 读取文件 其中文件名称是中文的 在windows 是 可以 在linux 不行

程序员编程日记的主页 程序员编程日记 | 初学一级 | 园豆:6
提问于:2022-02-19 22:52
< >
分享
所有回答(4)
0

windows的默认编码和linux是不一样的,查查看你的linux系统的默认编码是什么

wang_yb | 园豆:4891 (老鸟四级) | 2022-02-19 23:05

文件内容是可以的 就是文件的名称是中文的读取不到

支持(0) 反对(0) 程序员编程日记 | 园豆:6 (初学一级) | 2022-02-19 23:06

读取不到路径

支持(0) 反对(0) 程序员编程日记 | 园豆:6 (初学一级) | 2022-02-19 23:07

@UP技术控: 你好,可以先试试把文件名换成个简单的英文的,看看能否读取到。
如果能读取的话,就是中文文件名编码的问题,
如果读取不到,那就是路径有可能不对。比如linux在文件夹的分割符(/)和windows()是反着的.

支持(1) 反对(0) wang_yb | 园豆:4891 (老鸟四级) | 2022-02-19 23:24

@wang_yb: 英文可以 你是说 比如windows 是 张三.txt linux 可能是 xxx.txt 这样吗

支持(0) 反对(0) 程序员编程日记 | 园豆:6 (初学一级) | 2022-02-19 23:26

@UP技术控: 是的,我是想先排除下看看是不是系统编码的问题

支持(0) 反对(0) wang_yb | 园豆:4891 (老鸟四级) | 2022-02-20 01:32

@wang_yb: 英文正常 中文不行 这样是改linux系统 还是代码

支持(0) 反对(0) 程序员编程日记 | 园豆:6 (初学一级) | 2022-02-20 01:38

@UP技术控: 用 locale 命令看看系统支持的编码
把utf8 编码的支持安装上

支持(0) 反对(0) wang_yb | 园豆:4891 (老鸟四级) | 2022-02-20 02:03

@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 ~]#

支持(0) 反对(0) 程序员编程日记 | 园豆:6 (初学一级) | 2022-02-20 02:05

@UP技术控: 这个编码应该是支持中文的。读文件的代码片段能看看不

支持(0) 反对(0) wang_yb | 园豆:4891 (老鸟四级) | 2022-02-20 02:14

@wang_yb:

string applicationRoot = AppContext.BaseDirectory;

        if (!File.Exists(AppContext.BaseDirectory + @"啊.txt"))
        {
            throw new CustomException(AppContext.BaseDirectory + @"/啊.txt", ReturnCode.E1000003);
        }
支持(0) 反对(0) 程序员编程日记 | 园豆:6 (初学一级) | 2022-02-20 02:16

@wang_yb: {
"code": 1000003,
"message": "/NetCoreDemo/publish//啊.txt",
"data": null,
"success": false
}

支持(0) 反对(0) 程序员编程日记 | 园豆:6 (初学一级) | 2022-02-20 02:16

@UP技术控: 这个 message 中路径好像多个 / , //啊.txt

支持(0) 反对(0) wang_yb | 园豆:4891 (老鸟四级) | 2022-02-20 02:25

@wang_yb: if (!File.Exists(AppContext.BaseDirectory + @"啊.txt")) 判断在这 是 没有的

支持(0) 反对(0) 程序员编程日记 | 园豆:6 (初学一级) | 2022-02-20 02:28

@UP技术控:
修改编码:
vi /etc/profile

export LC_ALL="zh_CN.GBK"
export LANG="zh_CN.GBK"

让修改生效:source /etc/profile

修改这个中文编码试试看呢

支持(0) 反对(0) wang_yb | 园豆:4891 (老鸟四级) | 2022-02-20 02:31

@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=
还是不行

支持(0) 反对(0) 程序员编程日记 | 园豆:6 (初学一级) | 2022-02-20 02:41

@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));
            }
支持(0) 反对(0) jzblive | 园豆:428 (菜鸟二级) | 2022-02-22 19:52
0

我这里在 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=
dudu | 园豆:30775 (高人七级) | 2022-02-20 09:45

用的是 ubuntu 18.04

支持(0) 反对(0) dudu | 园豆:30775 (高人七级) | 2022-02-20 09:49

我这边是阿里云的 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);

支持(0) 反对(0) 程序员编程日记 | 园豆:6 (初学一级) | 2022-02-20 10:45

@UP技术控: 是控制台程序还需 ASP.NET Core 程序?

支持(0) 反对(0) dudu | 园豆:30775 (高人七级) | 2022-02-20 11:39

@dudu: ASP.NET Core 程序

支持(0) 反对(0) 程序员编程日记 | 园豆:6 (初学一级) | 2022-02-20 11:41

@dudu: 我现在系统切成 ubuntu 18.04 也是一样 尴尬

支持(0) 反对(0) 程序员编程日记 | 园豆:6 (初学一级) | 2022-02-20 11:41

@UP技术控: 我用 ASP.NET Core 试试

支持(0) 反对(0) dudu | 园豆:30775 (高人七级) | 2022-02-20 12:47

@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, "啊"));

Console.WriteLine("Hello, World111111111111111111111111!");
Console.ReadLine();

输出
System.Text.DBCSCodePageEncoding
您好,北京欢迎你
/NetCoreDemo/publish/啊
Hello, World111111111111111111111111!

也是没法识别中文路径

/NetCoreDemo/publish/啊 这个文件夹是存在的

支持(0) 反对(0) 程序员编程日记 | 园豆:6 (初学一级) | 2022-02-20 13:24

@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);
    }   
} 
支持(0) 反对(0) dudu | 园豆:30775 (高人七级) | 2022-02-20 13:53

@dudu: 我现在是完全干净的系统 完全干净的demo 加上
这段

var path = AppContext.BaseDirectory + @"博客园博问.txt";
Console.WriteLine(path);
var existence = System.IO.File.Exists(path);
Console.WriteLine(existence);
一样是不行 放弃

感谢帮助

支持(0) 反对(0) 程序员编程日记 | 园豆:6 (初学一级) | 2022-02-20 14:16
0

不要使用中文,可能会乱码。
.Net core 开发和部署的一个教程写得不错,图文并茂,可以去看看。
《.NET Core 跨平台实战》

楠木大叔 | 园豆:2083 (老鸟四级) | 2022-02-21 10:54
0

看一下源代码文件(也就是 Program.cs 之类的)的编码呢,如果是 GBK 的建议先转成 UTF8 试试。

沈星繁 | 园豆:1096 (小虾三级) | 2022-02-25 11:44
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册