Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Как узнать имя запускаемого файла


Автор: Нитонисе 18.11.2011, 20:09
Есть программа Program.exe. Есть файл File.my. Установлена ассоциативная связь между программой Program.exe и файлами типа *.my. При запуске файла File.my открывается программа Program.exe и заполняется данными из файла. Я хочу в Caption главной формы поместить имя запускаемого файла. В переменной ParamStr(1) имя какого-то другого файла, по всей видимости копии. Где взять имя нужного мне файла с путем  нему?

Дополнительный вопрос. Как отображать имя файла, если путь к нему длинный? Что-то наподобие С:\MyFiles\...\Project\File.my. То есть смысл что средняя часть прячется троеточием, при этом общая строка укорачивается.

Автор: MAXIQ 19.11.2011, 04:44
extern PACKAGE AnsiString __fastcall ExtractFilePath(const AnsiString FileName);
extern PACKAGE AnsiString __fastcall ExtractFileDir(const AnsiString FileName);
 Объявлены в файле SysUtils.hpp
Может поюзай, по просматривай в отладчике результаты их работы... По крайней мере копия твоего файла создается в директории оригинала и его имя ты уже знаешь.
Строку директории с вырезкой середины придется обработать самостоятельно ручками с привязкой к слэшам через призму длины конечной строки, у тебря все-таки в заголовке действительно места не так уж много и строки подворачивать не будешь))) Хотя, можно заголовок отрисовать самому со всеми наваротами, но жизнь слишком коротка)) Не претендую на правоту, просто высказал первое, что в голову пришло.

Автор: 500mhz 19.11.2011, 10:16
GetCommandLine не? )))

Автор: Нитонисе 19.11.2011, 12:59
Цитата(MAXIQ @  19.11.2011,  04:44 Найти цитируемый пост)
extern PACKAGE AnsiString __fastcall ExtractFilePath(const AnsiString FileName);extern PACKAGE AnsiString __fastcall ExtractFileDir(const AnsiString FileName);

Эти функции дают не тот результат.

Цитата(500mhz @  19.11.2011,  10:16 Найти цитируемый пост)
GetCommandLine не? )))

Пример использования? Да и аргументы командной строки возвращаются функцией ParamStr, не? Так вот первый аргумент - это exe-приложение, а второй - запускаемый файл, но не тот, по которому я дважды кликнул, а какая-то его копия.

Автор: sawfish 22.11.2011, 07:48
Цитата

В переменной ParamStr(1) имя какого-то другого файла, по всей видимости копии.

Почему вы так решили?
Цитата

Где взять имя нужного мне файла с путем  нему?

В ParamStr(1) как раз должно быть имя файла с путем к нему.
Цитата

Я хочу в Caption главной формы поместить имя запускаемого файла.

Зачем? ИМХО это неудобно. Можно извлечь имя и поместить его в заголовок, а полное (с путем) хранить в отдельной переменной.
Код

SomeForm->Caption=ExtractFileName(ParamStr(1));                              

Автор: borisbn 22.11.2011, 09:21
Цитата(Нитонисе @  18.11.2011,  20:09 Найти цитируемый пост)
Я хочу в Caption главной формы поместить имя запускаемого файла

Цитата(bcb_help_ParamStr)
ParamStr(0) returns the path and file name of the executing program (for example, C:\TEST\MYPROG.EXE).


Цитата(Нитонисе @  18.11.2011,  20:09 Найти цитируемый пост)
Дополнительный вопрос. Как отображать имя файла, если путь к нему длинный? Что-то наподобие С:\MyFiles\...\Project\File.my.

http://msdn.microsoft.com/en-us/library/windows/desktop/bb773575(v=vs.85).aspx

Автор: Нитонисе 22.11.2011, 09:34
Цитата(sawfish @  22.11.2011,  07:48 Найти цитируемый пост)
Почему вы так решили?

Потому что я вижу совсем другое название. Или не верить глазам своим?  smile 

Цитата(sawfish @  22.11.2011,  07:48 Найти цитируемый пост)
Зачем? ИМХО это неудобно. Можно извлечь имя и поместить его в заголовок, а полное (с путем) хранить в отдельной переменной.

Так я в заголовок (Caption) и хочу кинуть имя файла. Только вот оно не соответствует тому файлу, который я запустил.

Цитата(borisbn @  22.11.2011,  09:21 Найти цитируемый пост)
ParamStr(0) returns the path and file name of the executing program (for example, C:\TEST\MYPROG.EXE).

Мне нужен не исполняемый файл exe, а ассоциированный с ним файл моего типа. Он в ParamStr(1). И хотя имя у него не такое, как у того, что я запускаю, если сохранить этот файл, то изменения произойдут и в том, который я запускал.

Автор: sawfish 22.11.2011, 09:39
Видимо, ТС имел ввиду файл File.my (см. первое сообщение).

Добавлено через 5 минут и 17 секунд
А в ParamStr(1) может возвращаться сокращенное имя (с тильдами). Тогда:
Цитата

You can obtain the long name of a file from the short name by calling the FindFirstFile function.



Автор: borisbn 22.11.2011, 11:12
Цитата(Нитонисе @  22.11.2011,  09:34 Найти цитируемый пост)
Мне нужен не исполняемый файл exe, а ассоциированный с ним файл моего типа

из этого
Цитата(Нитонисе @  18.11.2011,  20:09 Найти цитируемый пост)
Я хочу в Caption главной формы поместить имя запускаемого файла.

можно сделать вывод, что нужен exe (executable == запускаемый).

А вот на эту фразу
Цитата(Нитонисе @  22.11.2011,  09:34 Найти цитируемый пост)
И хотя имя у него не такое, как у того, что я запускаю, если сохранить этот файл, то изменения произойдут и в том, который я запускал.

смотрел минут 5 и ничего не понял

Автор: Нитонисе 22.11.2011, 17:29
Цитата(borisbn @  22.11.2011,  11:12 Найти цитируемый пост)
можно сделать вывод, что нужен exe (executable == запускаемый).

Неверный вывод. Запускаемым может быть любой файл. Например "Абракадабра.doc". Что будет в ParamStr(0)?

Цитата(borisbn @  22.11.2011,  11:12 Найти цитируемый пост)
смотрел минут 5 и ничего не понял

Все очень просто на самом деле. Есть файл File.my. Он ассоциирован с приложением Program.exe. Кликаю (запускаю!) файл File.my - открывается приложение Program.exe и в него загружаются данные из файла File.my. При этом в Caption главной формы помещается ParamStr(1). Мне бы хотелось в данном случае там отобразилась надпись "File.my", но нет, там что-то типа "1431~.MY". Поработав с эти файлом я сохраняю изменения. Так вот изменения эти произошли как раз в файле "File.my". То есть получается что File.my и 1431~.MY - это суть один файл.

Автор: sawfish 22.11.2011, 18:19
Еще раз напишу.

А в ParamStr(1) может возвращаться сокращенное имя (с тильдами). Тогда:
Цитата

You can obtain the long name of a file from the short name by calling the FindFirstFile function.

Автор: Alca 22.11.2011, 18:54
::GetFullPathName ?

Автор: Нитонисе 23.11.2011, 12:17
sawfish, спасибо за подсказку, ваша функция решила проблему.
Функция FindFirstFile ищет файл ParamStr(1) и помещает инормацию о нем в структуру WIN32_FIND_DATA. Два поля этой структуры cAlternateFileName и cFileName содержат как раз имя непонятное файла с тильдой и оригинальное название соответственно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)