exe не находит текстовый файл в той же директории

Я запускаю исполняемый файл, который читает текст из файла, который сохраняется в том же каталоге, что и исполняемый файл.
Я использую функцию _tfopen, которая возвращает errno 2, что означает, что файл отсутствует.
Как уже говорилось, текстовый файл находится в той же директории, что и exe, поэтому я использую только имя файла текстового файла, а не весь путь (хотя я пытался использовать абсолютный путь к файлу …).
Я запускаю исполняемый файл с другого компьютера, а не с того, на котором я работаю (версия для выпуска).

Другое приложение, которое использует тот же файл, также в том же каталоге, работает отлично.

Почему exe не может найти текстовый файл?

FILE* fileData;
if ((fileData = _tfopen(_T("Data.txt"), _T("r"))) == NULL)
return false;

0

Решение

Вы можете попробовать это: ваш вызов программы GetCurrentDirectory() и вывести результат куда-нибудь, чтобы вы могли убедиться, что текущий каталог программы действительно такой, как вы думаете. Вы могли бы использовать OutputDebugString() если вы работаете под отладчиком или MessageBox() если не.

Когда мне нужно убедиться, что я открываю совмещенный файл, я звоню GetModuleFileName( NULL, szExeFqn, sizeof(szExeFqn)) чтобы получить FQN файла EXE, удалите имя файла EXE и добавьте имя нужного мне файла. Таким образом, я не делаю никаких предположений, которые могут быть ложными — в конце концов, тривиально установить ярлык для каталога по умолчанию для программы, отличной от каталога, содержащего файл EXE.

Кроме того, если вы запустите свою программу из командной строки, введя полный путь к вашей программе, то текущим каталогом программы будет тот, в котором вы находились, когда запускали ее, не тот, где был найден EXE. Это также верно, если ваша программа найдена путем поиска PATH переменная окружения (да, она все еще существует в Windows.)

Вот пример того, что я использовал более десяти лет, чтобы сделать то, что вы описали:

char szHelpFileName[_MAX_FNAME];
char *cp;

GetModuleFileName( NULL, szHelpFileName, sizeof(szHelpFileName) );
cp = strrchr( szHelpFileName, '\\' );
if( cp )
{
cp++; // Point to the char just following the final slash.
}
else
{  // No backslash, is there a colon?
cp = strrchr( szHelpFileName, ':' );
if( cp )
{
cp++; // Point to the char just following the colon.
}
else
{  // I give up.  I'll have no path information.
cp = szHelpFileName;
}
}
strcpy( cp, "program.hlp" );

Конечным результатом является имя файла справки, который находится вместе с EXE-файлом. Если файл справки отсутствует (или его права доступа были каким-то образом скроганированы), это всегда работает. У меня никогда не было того, чтобы он шел по пути «паранойи», где в комментарии говорится: «Я сдаюсь».

2

Другие решения

Обычно операционные системы открывают файлы с относительным адресом, основываясь на текущем каталоге, а не на исполняемом местоположении.

Так, например, если ваш исполняемый файл находится в /path/to/exec/executable и вы вызываете его из /path/to/invoke, попробую открыть Data.txt как будто это было /path/to/invoke/Data.txt,

Вы можете взглянуть на этот вопрос и его ответы, чтобы узнать, как найти путь к исполняемому файлу в Windows. Или же этот ответ для различных других операционных систем.

1

Это должно работать даже без указания полного пути. Запускаете ли вы исполняемый файл из Visual Studio? Если да, убедитесь, что файл Data.txt находится в каталоге проекта, где находится файл * .vcxproj или * .sln.

0
По вопросам рекламы [email protected]