Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > ф-ция, выдающая полный путь к файлу


Автор: 586 5.8.2006, 09:19
Подскажите название функции, выдающей полный путь к файлу по короткому пути. Например, "cmd.exe" --> "C:\WINDOWS\SYSTEM32\cmd.exe"

Автор: MAKCim 5.8.2006, 09:23
может это просто поиск файла?

Автор: Daevaorn 5.8.2006, 11:16
586, 
Почти то:
DWORD GetFullPathName(
  LPCTSTR lpFileName,
  DWORD nBufferLength,
  LPTSTR lpBuffer,
  LPTSTR* lpFilePart
);
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/getfullpathname.asp

Автор: 586 5.8.2006, 11:39
Мне надо, чтобы она искала по путям, указанным в переменной окружения %path% и в текущей папке, как это делает функция CreateProcess, или cmd.exe.

Автор: apook 5.8.2006, 13:07
Вот то что надо:
Код

#include "iostream.h"
#include "dir.h"

int main(int argc, char *argv[])
{
char *p;
if ((argc > 1) && ((p = searchpath(argv[1])) != NULL))
    cout << "Полный путь к " << argv[1] << " - " << p << endl;
return 0;
}


Кстати CreateProcess однако не ишет в PATH ему надо точно указывать путь
иначе ищет в текущем каталоге и все.

Автор: Oleg_Ci 5.8.2006, 13:16
http://forum.vingrad.ru/index.php?showtopic=106611
Здесь что-то похожее.

Автор: 586 5.8.2006, 13:43
Код
Caption=searchpath("cmd.exe");

Работает!!!

Цитата(apook @  5.8.2006,  14:07 Найти цитируемый пост)
Кстати CreateProcess однако не ишет в PATH ему надо точно указывать путь
Код
CreateProcess(0, "ws32", 0, 0, 0, 0, 0, 0, &st, &pi);

apook, спасибо.

А есть способ найти путь к файлу без расширения?

Автор: apook 5.8.2006, 15:48
Такую функцию можешь написать сам. Примерно это может выглядеть так:

Код

#include "iostream.h"
#include "string.h"
#include "dir.h"


char *exist(char *filename)
{
char *p, expansion[5] = ".exe", *e;
if (((e = strrchr(filename, '.')) != NULL) && (strlen(e) <= 4));
else    strcat(filename, expansion);
p = searchpath(filename);
return p;
}


int main(int argc, char *argv[])
{
char *p, filename[15];
strcpy(filename, argv[1]);
if ((argc > 1) && ((p = exist(filename)) != NULL))
    cout << "Полный путь к " << argv[1] << " - " << p << endl;
else
    cout << "Файл " << filename << " не найден" << endl;    
return 0;
}
 

Стандартный алгоритм поиска файлов в ДОС таков:

   - Нет расширения имени файла и нет точки;  в  таком
     случае  производится  поиск  точного имени файла,
     если такое имя не найдено, добавляется расширение
     .com и поиск продолжается. Если и такого файла не
     найдено, то добавляется расширение .exe  и  поиск
     выполняется последний раз.

   - Расширение   имени  присутствует  -  производится
     поиск по точному имени файла;

Делай выводы и пиши навороченные функции smile  smile 

Автор: 586 5.8.2006, 17:23
Всё, разобрался. Вот конечная функция:
Код
BOOL __stdcall RecoverPathName(char *pstr, char *b, int cb)
{
 if(!SearchPath(0, pstr, 0, cb, b, 0))
  if(!SearchPath(0, pstr, ".exe", cb, b, 0))
   if(!SearchPath(0, pstr, ".com", cb, b, 0))
    return 0;
 return 1;
}

Вопрос решён.

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