C #: открытие текстового файла, хранящегося в том же проекте, что и приложение - PullRequest
0 голосов
/ 28 октября 2019

Мне удалось открыть текстовый файл с использованием абсолютного пути (в Visual Studio 2017), хотя, если я изменю расположение папки «Решение», весь код больше не будет работать, поскольку реальный физический путь изменился, и код не может ссылатьсясуществующее местоположение.

Я попытался создать текстовый файл в том же проекте, и теперь я хотел бы открыть этот файл в своем коде, поэтому, если местоположение всего Решения меняется, программа все еще может работать,кто-нибудь будет так любезен, чтобы помочь мне решить эту проблему? Я также искал в Интернете какое-то другое решение, использующее код, который ссылается на текущий каталог, но я не могу обойти его, так как текущий каталог выглядит как bin / debug, и если я пытаюсь вставить туда файл, код нераспознать местоположение (для меня это тоже не выглядит чистым решением).

Это код, который я использую до сих пор в приложении WPF, вся его цель - открыть содержимое текстового файла. построчно содержать страны, перечисленные в списке, и добавлять их в список, который будет отображаться при установке флажка.

private void listCountry_Initialized(object sender, EventArgs e)
        {
            listCountry.Visibility = Visibility.Hidden;
            string path = "C:\\Users\\david\\source\\repos\\StudentRecord\\StudentRecordSystemMod\\StudentRecord\\country.txt";
            if (File.Exists(path))
            {
                string[] myCountryFile = File.ReadAllLines(path);

                foreach (var v in myCountryFile)
                {
                    listCountry.Items.Add(v);
                }
            }
        }

Ответы [ 4 ]

1 голос
/ 28 октября 2019

Это отличный вариант использования для OpenFileDialog Class .

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

Вот пример использования из документации .

// Configure open file dialog box
Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
dlg.FileName = "Document"; // Default file name
dlg.DefaultExt = ".txt"; // Default file extension
dlg.Filter = "Text documents (.txt)|*.txt"; // Filter files by extension

// Show open file dialog box
Nullable<bool> result = dlg.ShowDialog();

// Process open file dialog box results
if (result == true)
{
    // Open document
    string filename = dlg.FileName;
}
0 голосов
/ 28 октября 2019

Вы можете попробовать использовать этот путь, который фактически является папкой проекта:

static public readonly string AppRootFolderPath
  = Directory.GetParent
    (
      Path.GetDirectoryName(Application.ExecutablePath
                            .Replace("\\Bin\\Debug\\", "\\Bin\\")
                            .Replace("\\Bin\\Release\\", "\\Bin\\"))
    ).FullName
  + Path.DirectorySeparatorChar;

В этой папке у вас есть значения по умолчанию Bin и Obj, например, если вы не изменили их ввкладка построения свойств проекта.

Таким образом, вы можете использовать:

static public readonly string CountryFile = AppRootFolderPath + "country.txt";

Но вы можете добавить в путь любую нужную вам подпапку, например Data:

static public readonly string AppDataFolderPath
  = AppRootFolderPath + "Data" + Path.DirectorySeparatorChar;

Следовательно, например, вы можете использовать:

static public readonly string CountryFile = AppDataFolderPath + "country.txt";

Здесь я использовал static, потому что я обычно помещаю такие переменные в класс Program, чтобы они походили на глобальные переменные, и вы можете поместить их в любое место.

Вы также можете использовать локальные данные пользователя или путь к документу, если файл можно редактировать:

Как инициализировать данные приложения пользователя и путь к документу

0 голосов
/ 28 октября 2019

Предполагая, что C:\\Users\\david\\source\\repos\\StudentRecord\\StudentRecordSystemMod\\ - это ваш проект, а StudentRecord\\country.txt - это папка и файл проекта в вашем проекте - вам нужно изменить «Копировать в выходной каталог», чтобы он был «Всегда копировать» или «Копировать, если новее» и «Действие сборки»"Содержимое" для файла в вашем проекте.

Screenshot of Project and Properties with Debug Output shown

Как вы можете видеть на скриншоте выше, структура папок для этого содержимого также создается.

Затем измените ваше назначение path начто-то вроде следующего:

string path = string.Join(@"\", Application.ExecutablePath, @"StudentRecord\country.txt");
0 голосов
/ 28 октября 2019

Просто и ясно, поместите файл, который вы хотите открыть, рядом с тем, где генерируется исполняемый файл, запомните изменения пути исполняемого файла в зависимости от того, находится ли ваш проект в режиме отладки или выпуска. Теперь установите:

string path = "country.txt";

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

Однако, если вы хотите сохранить свой файл вфиксированное местоположение независимо от того, где у вас есть исполняемый файл и / или файлы проекта VS, тогда самый простой путь для него:

string path = "C:\\country.txt";

Это абсолютный путь, но он довольно прости очень устойчивый к изменениям, вам придется изменить букву диска, чтобы сломать его, и если C: находится там, где находятся файлы вашей операционной системы, то, вероятно, вы этого не сделаете.

Если вам не нравитсяхраня файлы в корне, вы всегда можете найти путь, подобный следующему:

string path = "C:\\ProjectNameFiles\\country.txt";

Или, если вы предпочитаете поддерживать иерархию проектов, вы можете использовать:

string path = "C:\\MyProjectsFiles\\ProjectName\\country.txt";

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...