Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под *nix > Общие вопросы программирования
Перезагрузить страницу Кроссплатформенная работа с файлами
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
kodjan kodjan вне форума
Member
 
Сообщений: 65
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 25.10.2005
По умолчанию 13.01.2008, 21:13

Здраствуйте!) Тут по работе возник один вопрос - есть программа, довольно большого объема, написанная еще на древнем VC++ 6.0, и сейчас встал вопрос о ее переносе на Linux, причем код должен быть кросплатформенным (!).
Сейчас всем отделом решаем, как организовать в коде работу с файлами, и что лучше подойдет для этого, ведь выбирать есть из чего - стандартный fopen, fstream, STL, BOOST, QT... Главный критерий - кроссплатформенность! Что выбрать? Помогите любым советом) Заранее огромное спасибо!
Ответить с цитированием
  (#2 (permalink)) Старый
Alexey Dejneka Alexey Dejneka вне форума
Member
 
Сообщений: 451
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.11.2004
По умолчанию 13.01.2008, 21:43

Что включает в себя "работа с файлами"? Для чтения/записи текстовых и бинарных файлов перечисленных средств достаточно, и они или стандартны, или переносимы (за исключением 1) именования файлов /1/; 2) признака окончания строки в текстовых файлах).

/1/ разделитель каталогов; чувствительность к регистру букв; набор допустимых символов и комбинаций символов.
Ответить с цитированием
  (#3 (permalink)) Старый
kodjan kodjan вне форума
Member
 
Сообщений: 65
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 25.10.2005
По умолчанию 14.01.2008, 01:29

То, что перечислинных средств достаточно, это понятно, но что оптимально?)
Просто мне задание такое дали - узнать, какой оптимальный способ работы с файлами для написания кросплатформенного кода... Хотя мне кажется, что это какой-то глупый вопрос)
Ответить с цитированием
  (#4 (permalink)) Старый
kost kost вне форума
Member
 
Сообщений: 1,081
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 05.10.2004
По умолчанию 14.01.2008, 01:59

Оптимальный по какому критерию?
Ответить с цитированием
  (#5 (permalink)) Старый
kodjan kodjan вне форума
Member
 
Сообщений: 65
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 25.10.2005
По умолчанию 14.01.2008, 10:13

Цитата:
Оптимальный по какому критерию?
Кроссплатформенность! Ну и удобство использования)
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
kost kost вне форума
Member
 
Сообщений: 1,081
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 05.10.2004
По умолчанию 14.01.2008, 11:21

Думаю стоит взять пару известных опенсорц проектов под линух и посмотреть как они сделаны :-)
Ответить с цитированием
  (#7 (permalink)) Старый
Arachnelis Arachnelis вне форума
Member
 
Сообщений: 1,324
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.07.2007
По умолчанию 14.01.2008, 20:15

Я не сильно опытный в этом вопросе, поэтому выскажусь сугубо IMHO.

Использование STL (fstream, кстати, из него) и BOOST - ограничение себя определенным ЯП + лишние тормоза.
QT - не уверен, но думаю, что доп.мегагерцы на некоторых ногах процессора тоже будут потеряны так или иначе, опять же за счет зажимания обращений к ОС внутрь иерархии классов.

Т.е. лучше всего fopen() и т.п., благо они именно для того и созданы.

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

Смотреть "пару проектов" нет смысла - одному одно понравилось, другому другое. Будет такое же субъективное мнение, как моё, и его также можно будет смело отправить фтопку.
Ответить с цитированием
  (#8 (permalink)) Старый
Yaroslav Yaroslav вне форума
Member
 
Сообщений: 166
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.10.2004
По умолчанию 15.01.2008, 09:31

Цитата:
<div class='quotetop'>Цитата(kost)
Цитата:
Оптимальный по какому критерию?
Кроссплатформенность! Ну и удобство использования)
[/quote]

Тогда используй Qt - кроссплатформенно и удобно.
А использование fopen и т.д. при работе только с файлами открыть, закрыть и записать/считать ( все это описано в стандарте), можно, но работа с каталогами не описана стандартом соответственно в каждой ОС реализовано по своему.
Вывод для кроссплатформенности необходимо делать прослойку (для работы с каталогами) сам ты ее сделаешь или воспользуешься другими библиотеками.
Ответить с цитированием
  (#9 (permalink)) Старый
Arachnelis Arachnelis вне форума
Member
 
Сообщений: 1,324
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.07.2007
По умолчанию 16.01.2008, 01:56

Я уверен, что в любой ОС понятие каталогов есть, и они обязательно организованы в некое дерево. Это ж интуитивное представление человека об организации большого числа сущностей. К тому же в тех ОС, под которые существует порт QT, это так.

Сегодня потратил несколько часов на копание в хелпах с целью найти-таки портируемый способ задания пути файла. Результат - ноль, но в конце концов осенило благодаря определению портирумости, на которое я напоролся по ходу поиска:
Цитата:
... без изменений или с минимальными изменениями, такими как настройка директив препроцессора...
Вспомним, что компилятор автоматически конкатенирует все константные строки. Тогда, чтобы в исходнике все пути изначально зашивались универсальными, надо определить всего один макрос где-то в верхах проекта, например:
Код:
#ifdef _WINDOWS
   #define _DIR_ "\\"
#else
   #define _DIR_ "/"
#endif
А дальше так:
Код:
std::fopen( CurrentPath _DIR_ "MODULES" _DIR_ "PLUGINS" _DIR_ "file.ext" );
По аналогии - буква диска, разделитель имени с расширением и т.п.

Эти макросы даже не надо засовывать в "#ifdef _UNICODE", ибо:
Код:
std::fopen( _TEXT( "C" _DRIVE_ _DIR_ ... _DIR_ "file" _FEXT_ "ext" ) );
Единственный недостаток - получается менее читабельно, но IMHO здесь овчинка стоит выделки.

P.S. Возможно, гуру и читали сей опус с усмешкой, а для меня это - с гордостью изобретенный велосипед!
Ответить с цитированием
  (#10 (permalink)) Старый
Alexey Dejneka Alexey Dejneka вне форума
Member
 
Сообщений: 451
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.11.2004
По умолчанию 16.01.2008, 07:54

Цитата:
Я уверен, что в любой ОС понятие каталогов есть, и они обязательно организованы в некое дерево.
В DOS 1.0 был только корневой каталог. Ладно, это в прошлом.

Цитата:
По аналогии - буква диска, разделитель имени с расширением и т.п.
В Unix в полном путевом имени файла нет поля "диск". Технически файловые системы Unix не имеют расширений (хотя традиционно в имя файла включают информацию о его типе - после символа точка; например, hello.C.gz - упакованный gzip текст программы на языке C++).

На Wikipedia я нашел такую информацию о файловой системе OpenVMS:
Цитата:
Filesystems on each disk (with the exception of ODS-1) are hierarchical. A fully specified filename consists of a nodename, a username and password, a device name, directory, filename, file type, and a version number, in the format:

NODE"user pass"::device:[dir.subdir]filename.type;ver

For example, [DIR1.DIR2.DIR3]FILE.EXT refers to the latest version of FILE.EXT, on the current default disk, in directory [DIR1.DIR2.DIR3].
В стандарте Common Lisp есть довольно большая библиотека работы с именами файлов. Еще большая была в его предшественнике - Zetalisp.
Ответить с цитированием
  (#11 (permalink)) Старый
Arachnelis Arachnelis вне форума
Member
 
Сообщений: 1,324
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.07.2007
Unhappy 16.01.2008, 13:31

Благодарю!

Ну и как же быть?
Так приходят в голову два правила:
1. (updated) Все внутренние (относительно программы) файлы хранить только в иерархии от её основного каталога (не рядом, как делают M$ - "Common Files" и т.п.), и вызовы делать последовательными командами входа в подкаталог. По прежнему не нашел, но можно использовать std::system(), а передаваемую команду - всё туда же в макрос. Впрочем, можно целиком команду смены каталога - в макрос.
2. Внешние (пользовательские) команды - на совесть самого пользователя. Как получили, так системе и адресовать, без каких бы то ни было перекодировак, правок, добавлений.

Больше ничего на ум не приходит...

P.S. вспомнил еще систему имен internet - там вообще всё не так (DomenN...Domen3.Domen2.Domen1/SubDomen1/SubDomen2/.../[file.ext])...
Ответить с цитированием
  (#12 (permalink)) Старый
SiMM SiMM вне форума
Member
 
Сообщений: 1,961
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.08.2003
По умолчанию 16.01.2008, 14:30

Цитата:
вспомнил еще систему имен internet - там вообще всё не так (DomenN...Domen3.Domen2.Domen1/SubDomen1/SubDomen2/.../[file.ext])...
Нет, не так. Часть URI за доменом вообще является чем угодно. Если говорить о HTTP - то в HTTP никаких файлов нет. Есть контент. Соответствующий заданному URI.
http://ru.wikipedia.org/wiki/Доменное_имя
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
Alexey Dejneka Alexey Dejneka вне форума
Member
 
Сообщений: 451
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.11.2004
По умолчанию 16.01.2008, 22:15

Цитата:
Ну и как же быть?
Я думаю - принять волевое решение о списке поддерживаемых платформ. Для Windows и Unix подходит Ваше решение.

Цитата:
Все внутренние (относительно программы) файлы хранить только в иерархии от её основного каталога (не рядом, как делают M$ - "Common Files" и т.п.),
Может не получиться. В Unix у каждого пользователя свой каталог, в котором хранятся его настройки, файлы данных и т.д. Кроме того, принято раскладывать вспомогательные файлы в тематические каталог: программы - в /usr/bin, файлы данных - в /usr/share/<prog>, библиотеки и plugins - в /usr/lib/<prog>, временные файлы - в /tmp. Подкаталоги /usr могут быть закрыты от записи (или размещаться на read-only разделах), домашние каталоги - закрыты от других пользователей.

Цитата:
и вызовы делать последовательными командами входа в подкаталог. По прежнему не нашел, но можно использовать std::system(),
Под Unix system(3) не позволяет сменить текущий каталог.

Цитата:
Впрочем, можно целиком команду смены каталога - в макрос.
Или написать свою функцию смены каталога с разными реализациями под разные ОСи, а затем, в зависимости от целевой ОСи, использовать ту или иную версию.

Код:
sysdep.h:

extern void change_directory (const char *path);

sysdep-unix.c:

void
change_directory (const char *path)
{
  if (chdir (path) < 0) {
    // process errors
  }
}
Ответить с цитированием
  (#14 (permalink)) Старый
Arachnelis Arachnelis вне форума
Member
 
Сообщений: 1,324
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.07.2007
Wink 17.01.2008, 01:05

Alexey Dejneka, SiMM, благодарю за щедрые разъяснения!

-

Сегодня начал изучение QT. Распространенная вещь, многое предусмотрено... Не скажу, что в восторге, но наверно, все-таки её лучше будет использовать... Хотя утверждать пока не берусь...
Ответить с цитированием
  (#15 (permalink)) Старый
kodjan kodjan вне форума
Member
 
Сообщений: 65
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 25.10.2005
По умолчанию 14.02.2008, 14:08

Всем спасибо, было принято решение реализовать 2 класса для каждой из платформ, с общим интерфейсом Соответственно, на стадии компиляции и выбирается конкретный класс - под *nix или под win.

У меня возник еще один вопрос - как в *nix реализовать асинхронную работу с файлами? Все перерыл, но нигде не нашел... Она вообще, возможна?
Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с файлами Вячеслав1977 С/С++ 0 11.10.2011 09:22
Работа с файлами в С++ AlexKogot Вопросы начинающих программистов 4 30.08.2011 21:51
Работа с файлами в VB Demina_Kseny Visual Basic 0 27.05.2011 21:14
работа с файлами Natashka89 Prolog 3 27.05.2011 17:30
Работа с файлами Серега81 Вопросы начинающих программистов 1 26.05.2011 12:19
Работа с файлами yuliyayuliya Вопросы начинающих программистов 3 22.03.2011 22:15
Работа с wav-файлами vadim_gluzke .NET 0 19.02.2011 20:51
работа с файлами angelllvika Pascal 0 22.05.2010 22:31
Работа с файлами NOCaut Prolog 1 18.04.2010 00:45
Работа с dbf файлами Inna_r Delphi 1 27.02.2006 15:45
Работа с *.ini файлами Sane]{ Visual Basic 2 05.12.2005 03:45
ATL и работа с файлами Fireworm Visual C++ 1 28.07.2003 18:54



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов