Я решил опубликовать то, что должно быть работоспособным решением для этого.Это включает исправление кода «правильно», чтобы использовать абсолютные пути, но терпите меня.Это не так сложно.Ответ, опубликованный ФП, просто ужасен.Это совсем не «дешево».Наоборот, в долгосрочной перспективе это может оказаться очень дорогостоящим.
Теперь я предполагаю, что в коде разбросаны вызовы функций / методов, которые обращаются к файлам или папкам через относительные имена путей (скорее всего, неквалифицированные имена файлов),Их вполне может быть много, но, вероятно, все они сводятся к следующему:
do_something_with_this_file ("somefile.foo");
Теперь, если do_something_with_this_file
- это функция, определенная в приложении, решение очевидно: измените реализацию этой функции напреобразовать переданный параметр в абсолютный путь, если необходимо, прежде чем что-либо делать с ним.
Но жизнь не так проста, если do_something_with_this_file
- это что-то вроде вызова CreateFile
или, возможно, fopen
,Тогда мы застряли с существующим поведением для этой функции.Или мы?Вообще-то, нет.Есть простое решение, включающее только макрос и небольшой объем работы по реализации.
Время для примера.Я буду использовать fopen
, поскольку у него хороший простой API, но он одинаково хорошо применим и к CreateFile
или к чему-либо еще.
Во-первых, создайте файл заголовка, давайте назовем его AbsolutePathHelpers.h
, который переопределяетfopen
и все остальное, что вам нужно, например:
// AbsolutePathHelpers.h
FILE *APHfopen (const char *filename, const char *mode);
#define fopen APHfopen
// ...
Убедитесь, что этот заголовочный файл включен во все ваши модули компиляции, возможно, #include
вставив его в какой-то общий заголовочный файл, который онивсе используют.
Теперь запишите реализацию APHfopen
в новом файле .cpp (назовем его AbsolutePathHelpers.cpp
), который вам понадобится связать с вашим проектом:
// AbsolutePathHelpers.cpp
#include <stdio.h>
#undef fopen
FILE *APHfopen (const char *filename, const char *mode)
{
printf ("Opening %s\n", filename); // diagnostic message for testing
// Convert filename to absolute path here (if necessary) before calling the 'real' fopen
return fopen (filename, mode);
}
// ...
И, наконец, простая тестовая программа:
// Test program
#include <stdio.h>
int main ()
{
FILE *f = fopen ("myfile", "r");
if (f)
fclose (f);
printf ("Finished. Press any key...");
getchar ();
return 0;
}
Вывод:
Opening myfile
Finished. Press any key...
Запустите его на Wandbox .
Я оставлю деталипреобразования относительных путей в абсолютные пути к ОП.Все, что вам нужно, это глобальная переменная, содержащая текущий каталог, действующий при запуске программы.Или я сильно подозреваю, что это должен быть каталог, содержащий исполняемый файл.