Как я могу исправить это исключение DirectoryNotFoundException?

#c# #wpf #path

#c# #wpf #путь

Вопрос:

У меня есть исключение DirectoryNotFoundException для файла .txt, если я использую полный путь, он работает, но я не хочу использовать полный путь, потому что я хочу, чтобы программа работала независимо от того, где она размещена (совместимость с максимальным количеством компьютеров)

Вот мой код

 private void SaveClose_Click(object sender, RoutedEventArgs e)
{
    if (Windowed.IsChecked == true)
        windowed = true;
    else
        windowed = false;

    string textWriteWindowed;

    if (windowed == true)
    {
        textWriteWindowed = "-screen-fullscreen 0"   Environment.NewLine;
    }
    else
    {
        textWriteWindowed = "-screen-fullscreen 1"   Environment.NewLine;
    }

    var selectedResolution = ResolutionBox.SelectedItem.ToString();
    var split = selectedResolution.Split('x');
    widthChoose = Int32.Parse(split[0]);
    heightChoose = Int32.Parse(split[1]);

    string textWriteWidth;
    textWriteWidth = "-screen-width "   widthChoose   Environment.NewLine;

    string textWriteHeight;
    textWriteHeight = "-screen-height "   heightChoose   Environment.NewLine;

    File.WriteAllText(@"Resourcesarguments.txt", textWriteWindowed);
    File.AppendAllText(@"Resourcesarguments.txt", textWriteWidth);
    File.AppendAllText(@"Resourcesarguments.txt", textWriteHeight);

    this.Close();
}
  

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

1. Когда вы получаете мгновенный понижающий голос ;-;

2. Сначала попробуйте проверить, существует ли каталог методом Directory.Exists

3. «arguments.txt » находится в папке с именем «Ресурсы» рядом с моей программой, я не понимаю, почему она говорит мне, что, как я должен это написать?

4. попробуйте File. WriteAllText(«../ ../Resources/arguments.txt «, textWriteWindowed);

5. Не используйте «.. / .. /» в качестве начала относительного пути, поскольку это имеет смысл только в структуре выходных каталогов по умолчанию проекта Visual Studio, где выходные данные генерируются, например, в «bin / Debug /» (который даже можно изменить). Чтобы заставить его работать везде, вы должны создать каталог ресурсов в текущем рабочем каталоге приложения, если он не существует.

Ответ №1:

Первый аргумент File.WriteAllText принимает путь в качестве входных данных. Все, что вы упомянули, не является абсолютным путем, а просто относительным путем к файлу. WriteAllText создает файл, но не создает каталог сам по себе. Итак, что-то вроде:

 File.WriteAllText(@"arguments.txt", textWriteWindowed);
  

должно работать (и создать файл на соответствующем диске), но

 File.WriteAllText(@"Resourcesarguments.txt", textWriteWindowed);
  

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

 string folder=Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);
File.WriteAllText(@"arguments2.txt", "ABC");
  

Если вы хотите создать каталог, то вы могли бы сделать что-то вроде:

 System.IO.FileInfo file = new System.IO.FileInfo(filePath);
file.Directory.Create();// If the directory already exists, this method does nothing.

System.IO.File.WriteAllText(file.FullName, textWriteWindowed);
  

Надеюсь, это ответит на ваш запрос.

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

1. Привет, спасибо за ваш ответ, для чего нужен ABC? и почему «аргументы 2.txt »

Ответ №2:

перед сохранением файла необходимо проверить, существует ли папка,

если папка не существует, создайте ее с помощью

 Directory.CreateDirectory(...)

Directory.Exists(..) 
  

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

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

1. Я не знаю, куда их вывести ^^ ‘

Ответ №3:

ЕСЛИ вы хотите получить локальный путь к исполняемому файлу, используйте это:

  var fInfo = new FileInfo(System.Reflection.Assembly.GetCallingAssembly().Location);
  

Оттуда вы должны сделать следующее:

 var parentDir = new DirectoryInfo(fInfo.DirectoryName);
var subDir = new DirectoryInfo(parentDir.FullName   "Resource");
if(!subDir.Exists)
   subDir.Create();
  

Это гарантирует, что у вас всегда будет папка в каталоге вашего исполняемого файла. Но, чтобы вы знали, это абсолютно ужасный код, и его никогда не следует внедрять в производственную среду. Что, если какой-нибудь тупоголовый системный администратор решит поместить вашу программу / папку в область, к которой текущий пользователь также не имеет доступа / записи? Лучшее место для записи — это%APPDATA% , это гарантирует, что у пользователя всегда есть права на чтение / запись для того, что вы пытаетесь выполнить.

Ответ №4:

Я не знаю, как, но это сработало для меня :

  File.WriteAllText(@"./arguments.txt", textWriteWindowed);
            File.AppendAllText(@"./arguments.txt", textWriteWidth);
            File.AppendAllText(@"./arguments.txt", textWriteHeight);