#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);