Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
4 / 3 / 1
Регистрация: 30.11.2021
Сообщений: 101

Как заложить структуру папок в директории будущего приложения?

24.10.2024, 20:21. Показов 1277. Ответов 10

Студворк — интернет-сервис помощи студентам
Пользователь может создавать в приложении некоторые объекты и сохранять их в файл. Так как объекты специфичны, файлы хоть и xml но маловероятно что будут нужны за пределами данного проекта -- напокамяст предположил что они размещаются себе уютненько в папочке поддиректории директории самого приложения. Довольно стандартно вроде.

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

C#
1
2
3
4
5
6
7
8
9
10
11
12
public CarCreatorForm()
        {
            InitializeComponent();
 
            if (!Directory.Exists(Directory.GetCurrentDirectory() + "\\vehicles"))
                Directory.CreateDirectory(Directory.GetCurrentDirectory() + "\\vehicles");
 
            curPath = Directory.GetCurrentDirectory() + "\\vehicles";
            //labelTest.Text = Directory.GetCurrentDirectory()+"\\cars";
 
             ...
        }
оно мне не нравится, а гугление засыпает кучей инфы про файловый поток, как открыть, как вот это самое гет карент директори и т.п.

Подскажите, как правильно спросить гугла, или куда смотреть?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.10.2024, 20:21
Ответы с готовыми решениями:

Как узнать количество папок в директории?
Вот нашел в интернете такие команды: Данная команда, рекурсивно подсчитает количество файлов начиная с текущей папки и всех вложенных:...

Как получить список файлов и папок в директории
Всем привет! Как в python 3.x получить список файлов, папок и т.д. в директории? Например: Ввод: D:\Games\Counter-Strike 1.6\ ...

Как получить список папок в заданной директории
Подскажите как получить список папок в заданной директории (при этом имена файлов в список попадать не должны)?

10
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3403 / 2725 / 574
Регистрация: 04.09.2018
Сообщений: 8,553
Записей в блоге: 3
24.10.2024, 21:22
Цитата Сообщение от LexMcLinn Посмотреть сообщение
оно мне не нравится
оно никому не понравится, если три раза в трех строках вызывать один и тот же метод.
1
Эксперт .NET
 Аватар для Rius
13097 / 7655 / 1673
Регистрация: 25.05.2015
Сообщений: 23,331
Записей в блоге: 14
24.10.2024, 21:23
А ещё get current directory работает не так
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18274 / 14197 / 5368
Регистрация: 17.03.2014
Сообщений: 28,881
Записей в блоге: 1
24.10.2024, 21:45
Лучший ответ Сообщение было отмечено LexMcLinn как решение

Решение

LexMcLinn, 1) забудьте про CurrentDirectory и используйте Application.StartupPath

2) Вложенные каталоги можно создать за один вызов
C#
1
Directory.CreateDirectory(Path.Combine(Application.StartupPath, @"vehicles\cars"));
0
 Аватар для Andrey-MSK
3335 / 2222 / 387
Регистрация: 14.08.2018
Сообщений: 7,488
Записей в блоге: 4
25.10.2024, 08:41
Цитата Сообщение от LexMcLinn Посмотреть сообщение
Сейчас пришел к решению, что одна папочка Cars это неудобно будет, и нужно сделать папку и в ней несколько подпапок.
Зачем пользовательские файлы хранить в каталоге приложения? Есть ведь специально для этого созданные - Documents, AppData\Local...

Добавлено через 12 минут
LexMcLinn, Вот пример работы с каталогами и файлами
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
private static void CheckFolders()
{
    IWindowService _windowService = Current.Services.GetService<IWindowService>();
 
    string mainAppUserFolderName = "00 - DB Client";
    string importFolderName = "Импорт";
    string importFolderNameInstall = "Import";
    string reportFolderName = "Отчёты";
    string userFolderPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
    string mainAppUserFolderPath = Path.Combine(userFolderPath, mainAppUserFolderName);
    string importFolderPath = Path.Combine(mainAppUserFolderPath, importFolderName);
    string reportFolderPath = Path.Combine(mainAppUserFolderPath, reportFolderName);
    string originalImportFilesPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, importFolderNameInstall);
    string fileName;
    string destFileName;
 
    try
    {
        // Проверка наличия необходимых каталогов.                
 
        if (!Directory.Exists(mainAppUserFolderPath) || !Directory.Exists(importFolderPath) || !Directory.Exists(reportFolderPath))
        {
            Directory.CreateDirectory(mainAppUserFolderPath);
            Directory.CreateDirectory(importFolderPath);
            Directory.CreateDirectory(reportFolderPath);
 
            string[] files = Directory.GetFiles(originalImportFilesPath);
 
            foreach (string s in files)
            {
                fileName = Path.GetFileName(s);
                destFileName = Path.Combine(importFolderPath, fileName);
 
                File.Copy(s, destFileName, true);
            }
 
            string finalMessage =
                "Создание необходимых файлов и папок завершено.\n\r\n\r" +
                "В каталоге \"Мои Документы\" созданы следующие папки:\n\r" +
                "1. \"00 - DB Client\" - главная папка с файлами для работы программы.\n\r" +
                "2. \"Импорт\" - папка с шаблонами для импорта данных в БД.\n\r" +
                "3. \"Отчёты\" - папка в которой будут сохраняться отчеты. " +
                "Отчёты будут записываться в папки с названием объекта строительства.\n\r" +
                "\n\rПапки и файлы не удалять и не переименовывать!";
 
            _windowService.ShowInfoMessage(finalMessage, "Подготовка завершена");
        }
 
        // Если проверка каталогов прошла, а некоторые файлы были удалены между запусками приложения,
        // здесь производится проверка на наличие всех необходимых файлов.
 
        DirectoryInfo originalDirInfo = new DirectoryInfo(originalImportFilesPath);
        DirectoryInfo targetDirInfo = new DirectoryInfo(importFolderPath);
 
        IEnumerable<FileInfo> originalFiles = originalDirInfo.GetFiles("*.*", SearchOption.AllDirectories);
        IEnumerable<FileInfo> targetFiles = targetDirInfo.GetFiles("*.*", SearchOption.AllDirectories);
 
        IEnumerable<FileInfo> queryOriginalOnly = originalFiles
            .Except(targetFiles, new FileCompare());
 
        if (queryOriginalOnly.Any())
        {
            foreach (FileInfo v in queryOriginalOnly)
            {
                fileName = Path.Combine(originalImportFilesPath, v.Name);
                destFileName = Path.Combine(importFolderPath, v.Name);
 
                File.Copy(fileName, destFileName, true);
            }
 
            _windowService.ShowInfoMessage("Необходимые файлы восстановлены.", "Подготовка завершена");
        }
    }
    catch (Exception ex)
    {
        _windowService.ShowErrorMessage(ex.ToString(), "Ошибка инициализации");
    }
}
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3403 / 2725 / 574
Регистрация: 04.09.2018
Сообщений: 8,553
Записей в блоге: 3
25.10.2024, 09:00
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Есть ведь специально для этого созданные -Documents, AppData\Local...
если тулза переносная..? Documents захламлять/копаться... AppData\Local еще не каждый найдет..
2
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
25.10.2024, 09:45
Цитата Сообщение от OwenGlendower Посмотреть сообщение
1) забудьте про CurrentDirectory и используйте Application.StartupPath
Ну, забывать не совсем правильно. В конкретном случае применять неправильно, но всякие тулзы очень часто пляшут от рабочей папки, а не фактического расположения.
1
4 / 3 / 1
Регистрация: 30.11.2021
Сообщений: 101
25.10.2024, 09:56  [ТС]
Про стартПас увидел, услышал. Осознаваю.
Мои сомнения изначально крутились вокруг факта, что приложение в конструкторе главной формы каждого раза создавая сие окно, идёт проверять и создавать папки.

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

У меня ощущение, что все эти пути к папкам, значения поумолчаний, толщины линий в оформлении -- это всё обычно какое-сь "сеттингс" и наверное его принято оформлять как-то отдельно.
0
sleep
 Аватар для I can
4930 / 4590 / 840
Регистрация: 13.04.2015
Сообщений: 9,743
25.10.2024, 10:46
Цитата Сообщение от Wolfdp Посмотреть сообщение
всякие тулзы очень часто пляшут от рабочей папки
Кстати, в других языках есть замечательная функция chdir, задающая текущую директорию. Очень полезна бывает иногда. В Шарпе есть что-то подобное? Как то я подзабыл этот момент..
0
 Аватар для Andrey-MSK
3335 / 2222 / 387
Регистрация: 14.08.2018
Сообщений: 7,488
Записей в блоге: 4
25.10.2024, 10:50
Цитата Сообщение от I can Посмотреть сообщение
В Шарпе есть что-то подобное?
Есть. Environment.CurrentDirectory Свойство.

Добавлено через 1 минуту
I can,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
using System;
using System.IO;
 
class Test
{
    public static void Main()
    {
        try
        {
            // Get the current directory.
            string path = Directory.GetCurrentDirectory();
            string target = @"c:\temp";
            Console.WriteLine("The current directory is {0}", path);
            if (!Directory.Exists(target))
            {
                Directory.CreateDirectory(target);
            }
 
            // Change the current directory.
            Environment.CurrentDirectory = (target);
            if (path.Equals(Directory.GetCurrentDirectory()))
            {
                Console.WriteLine("You are in the temp directory.");
            }
            else
            {
                Console.WriteLine("You are not in the temp directory.");
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("The process failed: {0}", e.ToString());
        }
    }
}
1
25.10.2024, 10:54

Не по теме:

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Environment.CurrentDirectory = (target);
Ага, подзабыл немного.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.10.2024, 10:54
Помогаю со студенческими работами здесь

Как получить список файлов и папок в директории
Как получить список файлов и папок в директории (именно в директории, без файлов подпапок)?

Как узнать атрибуты файлов и папок директории?
Здравствуйте! Знаю, как вывести с помощью функций diropen, readdir, closedir и scandir содержимое директории, но вот как узнать еще...

Как получить список папок в одной директории ?
IDLE (Python 3.10 64-bit) Windows 10 ————————— Нужны только названия папок, которые построчно запишутся в файл: out_ok.txt Вот...

Как получить имена всех папок в определенной директории?
Как получить имена всех папок(не файлов!) в данной дир-ие?

Как узнать размеры всех папок в указанной директории?
Здравствуйте! У меня вопрос следующего характера, вот смотрите, есть цикл такого вида: for /d %%A in (D:\directory\*) do (echo %%A) т.е....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru