Файл не создается в правильном каталоге С++

Я пытаюсь использовать fstream для создания файла, однако файл, который я пытаюсь создать, не появится в каталоге .exe или где-либо еще в каталоге файлов. После поиска на моем компьютере файла я обнаружил, что он был создан в совершенно другом каталоге, хотя я использую относительный каталог.

Это код для создания файла:

ofstream file;
file.open("something.jpg", ios::out|ios::binary|ios::beg);

Каталог созданного файла: C:\Users\user-pc

Каталог проекта: D:\Users\user-pc\Documents\Visual Studio 2012\Projects\recvFile

кстати, использование абсолютного каталога прекрасно работает. Может ли это быть проблемой с рабочим каталогом проектов?


person Erran    schedule 18.08.2015    source источник
comment
Короткий ответ да. Задайте рабочий каталог в свойствах проекта.   -  person Dominique McDonnell    schedule 18.08.2015
comment
Как вы думаете должны создать файл? Как разработчик, вы должны принять осознанное решение. Относительно X все в порядке, если вы знаете, откуда взялся X. Относительно случайного каталога нет.   -  person MSalters    schedule 18.08.2015


Ответы (3)


В Visual Studio щелкните правой кнопкой мыши свой проект, выберите «Свойства», затем перейдите к «Свойства конфигурации», затем «Отладка». Есть строка "Рабочий каталог". Вы можете установить рабочий каталог там. Если вам нужно сделать это программно, вы можете использовать SetCurrentDirectory .

Если вам нужно создать файл в том же каталоге, что и местоположение .exe, вы можете использовать этот подход: https://stackoverflow.com/a/124901/1915854

Вызовите GetModuleFileName(), используя 0 в качестве дескриптора модуля...

Если .exe установлен в общем каталоге, таком как Program Files, то создание файла в том же каталоге может потребовать дополнительных разрешений и может быть плохой идеей. Если .exe просто клонируется в каталог, где он должен создавать файлы, то такой проблемы нет.

person Serge Rogatch    schedule 18.08.2015
comment
Я только что заметил, что если я запускаю приложение из Visual sudio, оно создает файл в каталоге проекта (что имеет смысл, поскольку рабочим каталогом является ProjectDir). Но проблема остается; если я запускаю exe из cmd, файл создается в неправильном каталоге. - person Erran; 18.08.2015
comment
В вопросе вы должны подробно указать, как вы запускаете программу из cmd. Какую подсказку дает cmd? Какая в нем текущая директория? - person Serge Rogatch; 18.08.2015
comment
видимо, я ошибся, думая, что exe создаст файл в каталоге, где хранится exe, а не там, откуда он запускается. Файл просто создается в текущем каталоге cmd. - person Erran; 18.08.2015
comment
@Erran, я добавил описание того, как определить каталог .exe . - person Serge Rogatch; 18.08.2015
comment
Создание файла в каталоге EXE — очень плохая идея. Windows 2000 запретила это по рекомендации, XP начала применять правило. С Vista вы получаете дополнительные сложности UAC. Проще говоря, каталог EXE является общим ресурсом и поэтому недоступен для отдельных учетных записей пользователей. Теперь чтение файлов из вашего EXE-каталога совершенно нормально, и для этого приемлем метод GetModuleFileName. - person MSalters; 18.08.2015
comment
@MSalters, это применимо только в том случае, если он устанавливает приложение. Если он просто скопирует .exe в каталог, где должны быть данные (вид переносимого развертывания), то такой проблемы не должно быть, если только он не скопирует .exe во что-то вроде Program Files. - person Serge Rogatch; 18.08.2015
comment
Большое спасибо, ребята, вы мне очень помогли. - person Erran; 18.08.2015

Попробуйте добавить "../" к ссылке:

file.open("../something.jpg", ios::out|ios::binary|ios::beg);
person Timo Rzipa    schedule 18.08.2015

Файл будет создан в папке Debug/Release вашего проекта. попробуйте то, что предложил Тимо Рипа.

person Raj Samant    schedule 18.08.2015