File.Exists(Path) 从文本文件中获取 'string (Path)' 时总是 return false

File.Exists(Path) always return false when get 'string (Path)' from text file

我编写代码来接收文本文件的路径并将其存储在我在 public 中声明的字符串变量中。 然后我想知道文件是否存在,使用

System.IO.File.Exists(pathoffile)

但它总是 return 错误,即使有一个文件。 然后当我尝试像这样直接添加字符串路径时

public string propertyfile = @"C:\Users\PFA Wongsawat\Desktop\part_no_and_path_list.txt"

函数

System.IO.File.Exists(pathoffile)

return 真

我已经检查了从文本文件中读取的接收路径(字符串)。通过切断 "\n" 和 "\r" 并使用 trim() too.But 它仍然 return 是错误的。 我错过了什么吗?这两者有什么区别?我对这个 c# 太陌生了。我很不擅长这个提前抱歉。

这是我的代码

public string pathfromread, partnumber, pathfile, portname, partnofromserial,propertypathfile; //Declare Variables
        public string propertyfile = @"C:\Users\PFA Wongsawat\Desktop\Properties.txt";
        public string pathoffile ;
        public string backuppath ;
        public string pdffolderpath  ;

private void propertyget()
        {
            if (File.Exists(propertyfile))
            {
                StreamReader readpropertyfile = new StreamReader(propertyfile);
                string readproperty;

                while ((readproperty = readpropertyfile.ReadLine()) != null)
                {
                    string[] propertyfromread = readproperty.Trim().Split('=');
                    if (propertyfromread.GetValue(0).ToString() == "pathoffile")
                    {
                        pathoffile = propertyfromread.GetValue(1).ToString();
                        pathoffile = pathoffile.Replace("\n", "").Replace("\r", "");
                        MessageBox.Show(pathoffile, "path file");
                    }
                    else if ((propertyfromread.GetValue(0).ToString() == "backuppath"))
                    {
                        backuppath = propertyfromread.GetValue(1).ToString();
                        backuppath = backuppath.Replace("\n", "").Replace("\r", "");
                        MessageBox.Show(backuppath);
                    }
                    else if ((propertyfromread.GetValue(0).ToString() == "pdffolderpath"))
                    {
                        pdffolderpath = propertyfromread.GetValue(1).ToString();
                        pdffolderpath = pdffolderpath.Replace("\n", "").Replace("\r", "");
                        MessageBox.Show(pdffolderpath);
                    }
                    else if ((propertyfromread.GetValue(0).ToString() == "portname"))
                    {
                        portname = propertyfromread.GetValue(1).ToString();
                        portname = portname.Replace("\n", "").Replace("\r", "");
                        MessageBox.Show(portname);
                    }
                }
            }

 private void Form1_Load(object sender, EventArgs e)
        {
            propertyget();

            dv = dt.DefaultView; //set dv index count to != 0 to prevent error from null input when click on remove button

            if (System.IO.File.Exists(pathoffile))//Check if file exist or not
            {

            }
            else
            {
                try
                {
                    MessageBox.Show("Database Text File Missing. Please Select New File", "Database Text File Missing", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                    OpenFileDialog regispath = new OpenFileDialog();
                    regispath.Title = "Select Database Text File (part_no_and_path_list.txt)";
                    regispath.Multiselect = false;
                    regispath.Filter = "Text file (*.txt)|*.txt";
                    regispath.RestoreDirectory = true;
                    regispath.ShowDialog();
                    pathfile = regispath.FileName;
                    File.Copy(pathfile, pathoffile);
                }
                catch
                {

这是我的 属性 文本文件

pathoffile=@"C:\Users\PFA Wongsawat\Desktop\part_no_and_path_list.txt"
backuppath=@"C:\Users\PFA Wongsawat\Documents\part_no_and_path_list.txt"
pdffolderpath=@"C:\Users\PFA Wongsawat\Downloads\"
portname=COM3

在这种情况下,结果始终是一个显示“数据库文本文件丢失。请Select新建文件”的消息框

谢谢你,对不起我的英语不好。

你不要把 @"" 放在文本文件中 ,你只把它们放在代码中,因为 c# 编译器就是这样知道的它们是字符串(并且知道不要将斜杠解释为转义字符)

只需让您的文本文件看起来像:

pathoffile=C:\Users\PFA Wongsawat\Desktop\part_no_and_path_list.txt

我也推荐你使用:

Split(new []{'='}, 2)

这将允许您在您的路径中使用 =,方法是将拆分 return 设置为最多 2 个拆分值;路径中合法的任何 = 都将被保留

实际上,我建议您使用 c# 具有的各种内置设置机制之一;大约 25 年以来,我们都不需要读写自己的配置文件

如果你真的想继续自己动手,你可以通过使用字典来大量减少你的代码

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

public class Settings{
    private Dictionary<string,string> _conf = new Dictionary<string,string>();

    public string PathOfFile {
      get => _conf["pathoffile"];
    }

    public void ReadConfig(){
      File.ReadAllLines("conf.txt").ToDictionary(
        x => x.Split(new[]{'='},2)[0],
        x => x.Split(new[]{'='},2)[1]
      );
    }
}

是的,这就是您所需要的。每次你想添加另一个设置时,添加另一个 属性(如 public string PathOfFile),向文件添加另一个 love 并确保 属性 中的字符串与文件

在其他方面,请阅读 c# 命名约定; PublicThingsAreNamedLikeThis、_privateLikeThis、localLikeThis、neverlikethis

谢谢,我已经解决了这个问题

像这样从 属性 文本文件的路径中删除“@”和“””。

pathoffile=C:\Users\PFA Wongsawat\Desktop\part_no_and_path_list.txt
backuppath=C:\Users\PFA Wongsawat\Documents\part_no_and_path_list.txt
pdffolderpath=C:\Users\PFA Wongsawat\Downloads\
portname=COM3

我看不到这个的原因是我通过在消息框中看到结果来调试程序,它与真实的不匹配。谢谢。