Это мое первое приложение для Windows.
Мне нужно работать с папками, которые я создал в своем проекте, и мне нужно получить доступ к папке Data, в которую я помещаю файлы .txt.
Я попробую :
string fileName = @"Data\TextFile1.txt";
string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, fileName);
но я продолжаю получать эту ошибку:
impossible find part of path.
Как я могу объединить путь к папке с именем файла, чтобы после выпуска проекта все работало нормально?
Вот что я делаю в приложении asp.net:
Path.Combine(HttpRuntime.AppDomainAppPath, "Folder/FileName.txt");
Каталог создается при попытке доступа к файлу?
Возвращение BaseDirectory: C: \ Users \ myname \ Documents \ Visual Studio 2015 \ Projects \ projectName \ projectName \ bin \ debug
для хорошей работы мне нужен C: \ Users \ myname \ Documents \ Visual Studio 2015 \ Projects \ projectName \ projectName \ Data \ textfile, но как я могу это получить?
Сохраните расположение папки данных в файле app.config в разделе AppSettings и прочтите его во время выполнения с помощью класса ConfigurationManager.AppSettings.
Похоже, файла нет. В вашем проекте, если у вас есть файл в папке Data, щелкните файл правой кнопкой мыши и убедитесь, что для параметра Compile установлено значение Content, чтобы файл копировался в папку во время выполнения. Я согласен с приведенным выше комментарием, поместите точку останова в код, проверьте полный путь, который он получает, когда вы это сделаете, а затем проверьте, что файл и папка существуют в этом месте. Помните, что в проекте это будет bin / debug ... или bin / release .... В зависимости от того, работает ли это, ничего жестко запрограммированного, почти наверняка будет работать и при развертывании.
@MeJonata, Вы решили проблему тем, что предоставили решения людьми? если да, пожалуйста, примите, подумайте над ответом, если нет, сообщите нам, почему?





в C# .NET вы можете легко использовать свойства Среда при работе с формами.
Если вы хотите, например, путь Appdata делает это:
string MyPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\" + MyFileName;
Но убедитесь, что файл / путь существует! Для этого вы можете использовать Файл.Exists -Function:
if (File.Exists(MyPath))
{
//Do Something
}
(Для Файл-Class вам понадобится пространство имен System.IO!)
Обновлено:
Пример:
string MyPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\MyConfig.txt";
if (File.Exists(MyPath))
{
MessageBox.Show($"{MyPath} exists!");
}
Надеюсь, что это помогло;)
Подход Path.Combine лучше, в основном для переносимости.
Зачем объединять путь вручную, если для этого есть Combine?
Может быть, но если ему просто нужна поддержка Windows, это, ИМХО, самый простой способ.
Path.Combine всегда - более безопасный подход.
Могу показать рабочий пример ... я пытаюсь, но получаю ошибку
@Aria Не стесняйтесь отвечать по-своему, я просто всегда использую Environment, потому что это просто.
невозможно найти часть маршрута. я вижу в пути "\ bin \ debug" ... но мне нужно удалить ... я думаю
@MeJonata superuser.com/questions/150012/…
Эта проблема заключается не в использовании Environment, а в том, что вы не используете Path.Combine.
Смысл использования Environment - получить эти пути, не записывая их вручную в код. Если вы немного поработаете с этим, вы будете знать, как с этим бороться.
Если я правильно понимаю, вы пытаетесь прочитать какой-то файл, который вы добавили в свое решение в Visual Studio. Во-первых, чтобы эти файлы были «развернуты», щелкните их в обозревателе решений, перейдите в инструмент «Свойства» и посмотрите на «Копировать в выходной каталог». По умолчанию - «Не копировать». Измените этот параметр на «Копировать всегда» или «Копировать, если новее». Теперь ваши файлы будут скопированы в выходной каталог при построении решения. Затем, чтобы получить текущий путь сборки во время выполнения, посмотрите: Получение пути к текущей сборке
string path = (new System.Uri(Assembly.GetExecutingAssembly().CodeBase)).AbsolutePath;
из пути сборки вы можете получить путь к содержащей его папке, затем вы можете использовать Path.Combine (), чтобы получить желаемый путь к файлу.
Моя проблема проста ... у меня есть несколько классов с методом, которые читают поток, используя (FileStream stream = new FileStream (path, FileMode.Append, FileAccess.Write)) {
Все работает хорошо, но путь такой String path = @ "C: \ Users \ me \ Documents \ Visual Studio 2015 \ Projects \ nameProj \ nameProj \ Data \ fileName.bin";
на веб-сайте я просто делаю Path.Combine (HttpRuntime.AppDomainAppPath, "Folder / FileName.txt");
что я должен сделать ?
@MeJonata, ты почти у цели. Взгляните на ответ, который я опубликовал выше, они объясняют, как правильно получить текущий путь выполнения. Затем вы можете использовать некоторые служебные классы в пространстве имен System.IO, например FileInfo, DirectoryInfo, Path и File, и вы легко сможете читать и писать там, где вам нужно.
Если возможно, я бы не создавал никаких путей внутри приложения. Платформа .NET предоставляет файл конфигурации приложения для такого рода проблем. Вам нужно просто добавить этот раздел в свой файл конфигурации (app.config при разработке, затем application.exe.config после компиляции)
<configuration>
<appSettings>
<add key = "mydatafolder" value = "e:\whateverpathyoulike"></add>
</appSettings>
</configuration>
Затем во время выполнения прочитайте это значение из своего кода
string path = ConfigurationManager.AppSettings["mydatafolder"];
path = Path.Combine(path, fileName);
Его легко изменить как автоматически, так и вручную, чтобы адаптировать к любой среде, которую вы найдете на конечных компьютерах.
Ваши файлы данных должны быть доступны в выходной папке вместе с файлом .exe вашего приложения. для этого:
Data.Copy Always против Copy to output directoryЭто скопирует папку Data вместе со всеми файлами в папке Bin\Debug и будет работать с вашим существующим кодом.
Используйте отладчик, чтобы узнать, каково значение вашей переменной пути. Это не то, что вы ожидаете.