← →
guood ( 2002-03-28 17:46 ) [0]
Здраствуйте, Уважаемые Мастера.
Подскажите, как определить директорию, из которой было запушенно приложение. При загрузке моя программа считывает из Ini-файла, который лежит там же где и сама программа, конфигурационные параметры, но возникла проблема переноса проги в другую директорию => надо определить, что бы приложение определяло директорию откуда оно запускается
Заранее благодарю за помощь
с уважением.
← →
CrazyAngel ( 2002-03-28 17:48 ) [1]
GetCurrentDir()
← →
MAxiMum ( 2002-03-28 17:54 ) [2]
ExtractFileDir(ParamStr(0))
← →
guood ( 2002-03-28 17:54 ) [3]
to GrazyAngel
Огромное спасибо
← →
Donal_Graeme ( 2002-03-28 17:59 ) [4]
ExtractFilePath (ParamStr (0))
или можно
ExtractFilePath(Application.Exename)
← →
Donal_Graeme ( 2002-03-28 18:02 ) [6]
м-да.
кстати, GetCurrentDir в общем случае даст не тот эффект.
Delphi — поиск файлов и папок
← →
CrazyAngel ( 2002-03-28 18:03 ) [7]
А когда такое может случиться ? Набудущее .
← →
Donal_Graeme ( 2002-03-28 18:08 ) [8]
например, попробуй запустить свою Пуск-выполнить или поместив ярлык на рабочий стол, и запустить оттуда.
Одно лишь точно — GetCurrentDir 100% будет указывать на папку программы только тогда, когда программа запущена двойным кликом по исполняемому файлу, или же набором имени программы в файл-менеджере, находясь при этом в папке программы
← →
Donal_Graeme ( 2002-03-28 18:08 ) [9]
а.. ещё забыл, кажется она ещё будет работать как надо, если запустить проект из Дельфи 🙂
Источник: delphimaster.net
Рабочая директория: как получить
Понимаю что звучит обсурдно, видимо это на столько просто что я не могу понять как.
Как получить строку с рабочей директорией программы?
Желательно API функция, чтобы везде работала.
А вообще для Delphi надо/
#1
9:58, 10 ноя 2007
что подразумеваешь под рабочей?
ParamStr[0] — возвращает путь к EXE-файлу+имя файла (можно урезать ф-ей ExtractPath или как-то так)
GetCurrentDir — текущий путь.
#2
10:14, 10 ноя 2007
>GetCurrentDir — текущий путь.
#3
11:01, 10 ноя 2007
В общем случае проблема весьма сложная. Например, в линуксе, если програма пожата upx’ом, то ParamStr(0) вернёт вам мусор — т.е. что-то типа «/tmp/upxXXX».
GetCurrentDir() — неправильно, никто не гарантирует что при запуске программы текущей окажется именно та директория в которой она лежит. У меня, например, из-за этого ёфикатор иногда глючит (написан на Дельфи).
Если Виндовс — то можно ExtractFilePath(ParamStr(0))
Но строго говоря, в нормально настроенной ОСи рабочих папок у программы *ДВЕ*:
— папка куда программа установлена. Там лежит екзешник и основные файлы данных, но прав на запись туда у программы нет (примеры: вин икспи с ограниченным пользовательским аккаунтом, линукс, мак-ось 10).
Программирование в Delphi Урок 12.1. Многоформенные приложения / Илья Хохлов
— папка с сохранёнными играми и прочим, располагается в домашней папке учётной записи пользователя. В Линуксе это /home//./ , в выни икспи — обычно c:Documents and Settings\Application Data\ — точно можно узнать в реестре.
#4
20:19, 10 ноя 2007
Под виндой для этого есть SHGetSpecialFolderLocation().
А хранить что-то в папке с екзешником уже давно не рекомендуется. В Висте это работать скорее всего не будет.
#5
1:06, 11 ноя 2007
Mirage
Ну-ну, все ресурсы хранить в папке юзера? А если юзеров 2-е? Знать где лежит екзешник очень плезно, особенно при подгрузке ресурсов.
#6
4:37, 11 ноя 2007
>Ну-ну, все ресурсы хранить в папке юзера?
В нормальных ОСях, хранить всё записываемое в папке юзера — это стандарт. Даже в WinXP писать в папку программы нельзя (теоретически, поскольку никто не пользуется ограниченными учётными записями, на чём настаивает дядя Билл).
Мак-ось для старых программ, когда было принято писать в свою папку, отводит специальную «песочницу». И чтобы что-то поставить, нужен пароль администратора.
В Линуксе вообще все екзешники всех программ свалены в одну папку, писать в которую может только root. Установочные даные (неизменяемые, защищены от записи) лежат совершенно в другой, а изменяемые данные (напр. сохранённые игры) — в невидимой папке с именем программы внутри папки пользователя.
>А если юзеров 2-е?
Стандартом считается, что набор данных у каждого юзера свой, и в данные друг друга они лазить не могут если у них ограниченные учётные записи.
Например, та же Win XP — у каждого юзера свой рабочий стол, свои «Мои документы», и т.п. Когда я на работе кому-нибуть комп упавший восстанавливаю, на котором хлама накопилось лет за пять, то иногда невозможно не спрашивая пользователя разобраться, где — его «мои документы», а где — оставшиеся от старых хозяев машины.
Дома я пользую Линукс, где это вообще стандарт от рождения — рабочий стол, папки с документами, все настройки программ у каждого свои.
Короче.
Если хотите по серьёзному, то с самого начала постановите, что у программы две рабочих папки:
— установочная (уровни, текстуры) куда писать нельзя
— домашняя (настройки, сейвы)
В Виндовсе домашняя запрашивается у системы, а за установочную можно принять папку, где екзешник лежит.
В Линуксе ещё придётся повозиться, после запуска отыскивая установочную папку — поскольку экзешник будет лежать не в ней, а в общесистемной куче..
#7
7:10, 11 ноя 2007
Mirage
>А хранить что-то в папке с екзешником уже давно не рекомендуется. В Висте это работать скорее всего не будет.
Ну работает вообще то
Поясню ситуацию
Мне не надо ничего писать, просто надо создать документ Word’а через шаблон. А для этого нужен абсолютный путь к шаблону (если он лежит в папке с моей программой). Поэтому GetCurrentDir меня вполне устраивает
#8
11:38, 11 ноя 2007
Под «хранить» имелось в виду информацию, возникающую в процессе работы. Конфиги там, таблицы очков и т.п. Читать, конечно, можно из папки с программой.
#9
14:45, 11 ноя 2007
Cheb
Ну ты моск. браво! А теперь будь любезн поясни как найти то, что ты назвал установочной папкой.
#10
14:48, 11 ноя 2007
progDes
>Поэтому GetCurrentDir меня вполне устраивает
Думаю как раз наоборот. Если твою прогу запустить через иконку с рабочего стола(кстате путь запуска может быть любым) то GetCurrentDir даст тебе директорию рабочего стола а не директорию где лежит твоя прога.
#11
15:19, 11 ноя 2007
// app path TCHAR cfgname[MAX_PATH]; GetModuleFileName( 0, cfgname, MAX_PATH); for ( size_t i=_tcslen( cfgname)-1; i>0; i—) < TCHAR c = cfgname[i]; cfgname[i] = 0; if ( c == ‘\’ || c == ‘/’) break; >
Получаем в cfgname папку, в которой лежит .exe 😉
#12
16:38, 11 ноя 2007
Breezy
>Думаю как раз наоборот. Если твою прогу запустить через иконку с рабочего стола(кстате путь запуска может быть любым) то GetCurrentDir даст тебе >директорию рабочего стола а не директорию где лежит твоя прога.
Если мою прогу запустить с рабочего стола, то все работает, потому что у ярлыка рабочая папка по умолчанию — там где лежит exe-шник. А вот если поменять рабочую папку у ярлыка. тады конечно
CyberDemon
Да в принципе можно было и в Delphi так же сделать, просто хотелась знать как элегантней
#13
22:47, 11 ноя 2007
>А теперь будь любезн поясни как найти то, что ты назвал установочной папкой.
Бёрём какой-то известный файл, который гарантированно должен лежать в корне установочной папки, и проверяем на его наличие в /usr/share// .если нет — то проверяем ещё в /usr/local/share// .если он там есть — принимаем за установочную папку, иначе ищем по ExtractFilePath(ParamStr(0)) (мало ли, может её вручную куда-то распаковали). Если файла ни в одном из этих мест нет — делаем харакири.
В Винде всё гораздо проще:
Проверяем наличие файла по ExtractFilePath(ParamStr(0)), и если он там есть — принимаем за установочную папку, иначе делаем харакири.
>Да в принципе можно было и в Delphi так же сделать, просто хотелась знать как элегантней
В Дельфи путь к экзешнику получают именно как ExtractFilePath(ParamStr(0))
Домашнюю папку:
Получаем имя юзера
Берём /home//./
При отсутствии — создаём, при наличии — проверяем, можем ли туда писать. Если не удалось — делаем харакири.
В Винде:
Получаем от винды папку по CSIDL_APPDATA, принимаем её за домашнюю, проверяем возможность записи., и т.д.
#14
9:13, 12 ноя 2007
var s:string;
begin
.
s:= ExtractFilePath(application.ExeName);
.
//Где s строковая переменная которая получит строку с рабочей директорией программы.
//ExtractFilePath() — функция которая возвращает путь указаного приложения
//application.ExeName- текущее приложение которое путь которого нужно получить
Для Делфи короче просто нет.
Источник: gamedev.ru
Delphi, как найти папку на всех дисках в системе?
Привет.
Возник такой вопрос. Имеется папка, с названием, допустим, «ASDFG».
Как сделать программно в Delphi, чтобы при нажатии кнопки, программа быстренько пробежалась поиском по всем дискам (именно корень диска), в том числе и сьемные носители (флешки), и если нашел папку эту, выдал путьдо нее допустим в edit.
Папка будет лежать в корне диска, но при этом, буква диска будет всегда меняться, это будет флешка.
- Вопрос задан более трёх лет назад
- 311 просмотров
Решения вопроса 1
Full Stack Developer
procedure GetDriveLetters(AList: TStrings); var vDrivesSize : Cardinal; vDrives : array[0..128] of Char; vDrive : PChar; begin AList.BeginUpdate; try AList.Clear; vDrivesSize := GetLogicalDriveStrings(SizeOf(vDrives), vDrives); if vDrivesSize = 0 then Exit; vDrive := vDrives; while vDrive^ <> #0 do begin AList.Add(StrPas(vDrive)); Inc(vDrive, SizeOf(vDrive)); end; finally AList.EndUpdate; end; end; function FindFolderOnDrives(sFolderName : String):string; var i : Integer; lDrivers : TStringList; sFolderPath : String; begin Result := »; lDrivers := TStringList.Create; try GetDriveLetters(lDrivers); for i := 0 to lDrivers.Count — 1 do begin sFolderPath := lDrivers[i] + sFolderName; if DirectoryExists(sFolderPath) then begin Result := sFolderPath; Exit; end; end; finally lDrivers.Free; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin Edit1.Text := FindFolderOnDrives(‘ASDFG’); end;
Ответ написан более трёх лет назад
Источник: qna.habr.com