Досье.Exists(Path) всегда возвращает false при получении ‘string (Path)’ из текстового файла

#c# #file-io #configuration #load #text-files

#c# #file-io #конфигурация #загрузить #текстовые файлы

Вопрос:

Я пишу коды для получения пути к текстовому файлу и сохраняю его в строковой переменной, которую объявляю общедоступной. Затем я хочу знать, существует ли файл или нет, используя

System.IO.File.Exists(pathoffile)

Но он всегда возвращает false, даже если файл есть. А затем, когда я пытаюсь добавить путь к строке напрямую, как это

public string propertyfile = @"C:UsersPFA WongsawatDesktoppart_no_and_path_list.txt"

Функция

System.IO.File.Exists(pathoffile)

возвращает значение true

Я уже проверяю путь получения (строку), который я прочитал из текстового файла. Отрезав » n» и » r» и также используя trim().Но он все равно возвращает false. Я что-то пропустил? В чем разница между этими двумя?. Я слишком новичок в этом c #. Я очень плохо разбираюсь в этом, заранее прошу прощения.

Вот мои коды

 public string pathfromread, partnumber, pathfile, portname, partnofromserial,propertypathfile; //Declare Variables
        public string propertyfile = @"C:UsersPFA WongsawatDesktopProperties.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:UsersPFA WongsawatDesktoppart_no_and_path_list.txt"
backuppath=@"C:UsersPFA WongsawatDocumentspart_no_and_path_list.txt"
pdffolderpath=@"C:UsersPFA WongsawatDownloads"
portname=COM3

 

В этом случае результатом всегда будет окно с сообщением, показывающее «Текстовый файл базы данных отсутствует. Пожалуйста, выберите «Новый файл».

Спасибо вам и извините за мой плохой английский.

Комментарии:

1. Я предполагаю, что вы получаете его в неправильном формате / структуре, распечатайте его раньше и посмотрите разницу

2. Я предлагаю вам выводить значение в каждом случае на консоль. Вы увидите, что в рабочем случае нет двойных кавычек и @ знака. Это часть синтаксиса C # для строк. Ваш файл свойств не является C #. (Кроме того, я бы также посоветовал ознакомиться с соглашениями об именовании .NET, а также с доступом к массиву с использованием array[index] синтаксиса вместо вызова GetValue .)

3. @JonSkeet Спасибо! Я меняю свои коды на использование array [index] вместо этого, как вы сказали. И это работает отлично.

Ответ №1:

Вы не помещаете @" и " в текстовый файл, вы только помещаете их в код, потому что именно так компилятор c # знает, что это строки (и знает, что косые черты не следует интерпретировать как escape-символ)

Просто сделайте ваш текстовый файл похожим:

 pathoffile=C:UsersPFA WongsawatDesktoppart_no_and_path_list.txt
 

Я также рекомендую вам использовать:

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

Это позволит вам использовать = в вашем path, заставляя split возвращать максимум 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]
      );
    }
}
 

Да, это все, что вам нужно. Каждый раз, когда вы хотите добавить другой параметр, добавьте другое свойство (например, общедоступную строку PathOfFile ), добавьте еще одну любовь к файлу и убедитесь, что строка в свойстве совпадает со строкой в файле

В других областях, пожалуйста, ознакомьтесь с соглашениями об именовании c #; PublicThingsAreNamedLikeThis, _privateLikeThis, localLikeThis, neverlikethis

Ответ №2:

Спасибо, я уже решил эту проблему

Удалив «@» и «»» из пути в текстовом файле свойств следующим образом.

 pathoffile=C:UsersPFA WongsawatDesktoppart_no_and_path_list.txt
backuppath=C:UsersPFA WongsawatDocumentspart_no_and_path_list.txt
pdffolderpath=C:UsersPFA WongsawatDownloads
portname=COM3
 

Причина, по которой я не вижу этого, потому что я отлаживаю программу, видя результат в окне сообщения, и он не совпадает с реальным. Спасибо.

Комментарии:

1. Очень полезно узнать об отладчике Visual Studio. Создание текстовых полей только для отладки является громоздким и может привести к путанице. Вот руководство, которое поможет вам начать: docs.microsoft.com/en-us/visualstudio/get-started/csharp /…

2. @RudolfJan Спасибо, приятель. Жаль, что я не изучал это раньше.

3. Не расстраивайтесь, просто воспользуйтесь возможностью узнать что-то новое. Кстати, вам также может понравиться IAmTimCorey. Найдите YouTube.