#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.