Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 05.05.2013
Сообщений: 7
1

Не загружается файл по сокращенному имени

02.07.2013, 17:02. Показов 937. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Никогда не сталкивался с такой проблемой. Есть exe файл, в той же директории с экзешником находится папка folder, в папке есть файл file.txt, который надо открыть. Проблема вот в чем: если открываем файл по имени "folder//text.txt" то файл не открывается, а если открваем файл по полному имени, вместе с буквой диска, т.е. "E://Program Files//....//folder//text.txt", то все открывается как надо. Пробовал это делать стандартной функцией fopen и ф-ией CreateFile, вызовом:

C++
1
CreateFile(filePath.c_str(), GENERIC_READ, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)
она соответсвенно возвращает INVALID_HANDLE_VALUE. В других прогах такого не наблюдаю. Работаю в Visual Studio 2010, может быть в настройках проекта что-то не установил?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.07.2013, 17:02
Ответы с готовыми решениями:

По сокращенному имени написать полное
Написать программу, которая спрашивала бы N раз сокращённое имя, а печатала полное для пяти ваших...

[Ada] Поиск человека с самым большим весом в БД по сокращенному имени
) Имеется программа Heavy. Она готова много раз вводить и выводить пары имя-вес, пока вместо имени...

Автоподстановка по сокращенному названию
Всем привет! :) Есть основная таблица пациентов: "N, фио, диагноз,..." и соответстующая форма, в...

Загружается либо один файл, либо не загружается вообще ничего
Ребят, вот такая штука, не могу разобраться почему не работает, файлы выберает, пишет "выбрано...

10
Хочу в Исландию
1041 / 840 / 119
Регистрация: 10.11.2010
Сообщений: 1,630
02.07.2013, 17:44 2
Воспользуйся перед этой строкой функцией GetCurrentDirectory, она покажет в какой директории происходят действия.
0
Исследователь
318 / 317 / 24
Регистрация: 06.04.2011
Сообщений: 872
03.07.2013, 04:48 3
Я вот одного не понял... Это Unix-путь. Или, если угодно, путь к странице сайта.
Цитата Сообщение от Muffy Посмотреть сообщение
E://Program Files//....//folder//text.txt
В Windows-системах путь должен выглядеть так: "E:\\Program Files\\....\\folder\\text.txt".
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
03.07.2013, 11:27 4
Во-первых, текущая директория процесса может отличаться от той, в которой находится exe.
В этом случае он будет искать подпапку folder совсем не там, где ожидается.

Во-вторых, нужно смотреть, что возвращает GetLastError.

В-третьих, в CreateFile стоит флаг OPEN_ALWAYS, это значит, что файл будет создан,
если не существует. А доступ на запись к Program Files есть только у системы и
администраторов (в режиме elevated).
0
0 / 0 / 0
Регистрация: 05.05.2013
Сообщений: 7
03.07.2013, 13:08  [ТС] 5
Цитата Сообщение от skaa Посмотреть сообщение
Воспользуйся перед этой строкой функцией GetCurrentDirectory, она покажет в какой директории происходят действия.
в папке E:\BouncingBall\WorldEditor\Release
нужный файл в папке E:\BouncingBall\WorldEditor\Release\Ani

Цитата Сообщение от GrayWolf Посмотреть сообщение
Я вот одного не понял... Это Unix-путь. Или, если угодно, путь к странице сайта.
В Windows-системах путь должен выглядеть так: "E:\\Program Files\\....\\folder\\text.txt".
Где-то читал, что в windows можно и так и так. Пробовал и так и так - результат тот же (в программе изначально всегда используются \\).

Цитата Сообщение от Убежденный Посмотреть сообщение
Во-первых, текущая директория процесса может отличаться от той, в которой находится exe.
В этом случае он будет искать подпапку folder совсем не там, где ожидается.
Во-вторых, нужно смотреть, что возвращает GetLastError.
В-третьих, в CreateFile стоит флаг OPEN_ALWAYS, это значит, что файл будет создан,
если не существует. А доступ на запись к Program Files есть только у системы и
администраторов (в режиме elevated).
GetLastError возвращает ошибку "Невозможно найти путь к файлу". Текущая директория та, где находится exe.
0
Хочу в Исландию
1041 / 840 / 119
Регистрация: 10.11.2010
Сообщений: 1,630
03.07.2013, 17:38 6
А если сделать так, то это устроит?
C++
1
2
3
4
5
6
7
8
9
  char  snd[1025];
  char  snf[]="Ani\\text.txt";
  char  spath[2049]="";
 
  GetCurrentDirectory(1024,snd);
  strcat(spath,snd);
  strcat(spath,"\\");
  strcat(spath,snf);
  CreateFile(spath,...
0
0 / 0 / 0
Регистрация: 05.05.2013
Сообщений: 7
04.07.2013, 16:05  [ТС] 7
В общем получилось все очень странно. Рассказываю полную историю: я работаю над игрой и редактором уровней к ней. Игра построена следующим образом: считаем что exe файл с игрой расположен в некоторой папке ...\\Game, тогда в этой же папке находятся другие папки с игровыми ресурсами: в "...\\Game\\Ani" графика, в "...\\Game\\Music" музыка, в "...\\Game\\Worlds" уровни и т.д. Соответственно если надо загрузить что-то, то пишем к примеру "Ani\\имя_файла". В самой игре все работает отлично. exe от редактора находится в той же папке что и игровой, следовательно к ресурсам можно получать доступ таким же образом и можно использовать уже готовый код из движка. Теперь переходим к редактору уровней: надо открывать файлы на редактирование, это делается с помощью стандартного диалогового окна открытия файла. Допустим открываем файл по адресу

"E:\BouncingBall\Release\Worlds\level.lvl",

в результате ни один ресурс загрузить не получается, потому что система не находит файлы по заданному пути. Сделал вывод результата GetCurrentDirectory() прямо перед загрузкой ресурса, получаю такое:

"E:\BouncingBall\Release\Worlds",

т.е. директория, в которой находится не exe файл с редактором, а файл level.lvl, который мы открыли на редактирование. Ну решил ради эксперимента перебросить все ресурсы в папку "E:\BouncingBall\Release\Worlds" и вуаля - все прекрасно загрузилось. Сделал вывод GetCurrentDirectory() в самом начале работы редактора (до открытия файла), получаю:

"E:\BouncingBall\Release",

все как надо. Т.е. после открытия файла стандартным диалоговым окном текущая директория магическим образом поменялась на директорию, в которой находится открываемый файл. Как это так вообще?
0
Исследователь
318 / 317 / 24
Регистрация: 06.04.2011
Сообщений: 872
07.07.2013, 11:17 8
Цитата Сообщение от Muffy Посмотреть сообщение
Т.е. после открытия файла стандартным диалоговым окном текущая директория магическим образом поменялась на директорию, в которой находится открываемый файл. Как это так вообще?
ОС запоминает последний каталог, использовавшийся в стандартном диалоге открытия файлов и при повторном вызове снова использует его.
0
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
07.07.2013, 12:38 9
Цитата Сообщение от GrayWolf Посмотреть сообщение
В Windows-системах путь должен выглядеть так: "E:\\Program Files\\....\\folder\\text.txt".
Всё дело в С++ компиляторе. Символ слеша "\" зарезервирован самим компилятором, поэтому этот символ будет "не понят" компилятором.

Добавлено через 2 минуты
Цитата Сообщение от GrayWolf Посмотреть сообщение
ОС запоминает последний каталог, использовавшийся в стандартном диалоге открытия файлов и при повторном вызове снова использует его.
Да ну? Если открывать диалог одной программой - да, а если другая программа - она использует иной путь, по умолчанию - папка с программой. Или в ОС что-то поменяли, а меня не предупредили?)))
0
Исследователь
318 / 317 / 24
Регистрация: 06.04.2011
Сообщений: 872
07.07.2013, 17:45 10
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Символ слеша "\" зарезервирован самим компилятором
Я в курсе. У ТС был обратный слэш, если Вы обратите внимание. Я просто слегка подкорректировал путь с учетом "претензий" компилятора.
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Если открывать диалог одной программой - да, а если другая программа - она использует иной путь, по умолчанию - папка с программой
И опять я, блин, в курсе Но в данном конкретном случае речь идет об ОДНОЙ программе, автором которой является ТС. Эрго, Ваши "претензии" не принимаются как аргумент
0
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
07.07.2013, 17:52 11
Цитата Сообщение от GrayWolf Посмотреть сообщение
Ваши "претензии"
Это не претензии Просто я переживал, что что-то поменялось, а я живу по старым правилам) Но раз всё хорошо, то извините, если это показалось претензией)

Добавлено через 3 минуты
В момент запуска программы проинициализируйте символьный массив с помощью функции GetCurrentDirectory, а потом перед запуском файла SetCurrentDirectory и должно быть счастье без купюр)

Иного выхода нет, кроме поиска по всему жёсткому диску, что будет тупо)
0
07.07.2013, 17:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.07.2013, 17:52
Помогаю со студенческими работами здесь

Запросить ввод имени файла и если файл есть, создать другой файл
Прошу помощи. Как на паскаль написать программу, которая запрашивает ввод имени файла и если файл...

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

Не загружается файл
Привет форумчанам! Объясните пожалуйста, почему файл не хочет загружаться. Информация о файле...

Не загружается файл
Есть скрипт (обще известный): <?php require_once "bdconnect.php"; require_once "zashita.php";...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru