WedX - журнал о программировании и компьютерных науках

Простая виртуальная файловая система на C/C++

Я хотел бы реализовать очень простую виртуальную файловую систему (VFS), которая поддерживает некоторые базовые операции с файловой системой, такие как fwrite, fopen, fput и т. д. VFS — это уровень абстракции поверх некоторой конкретной ОС, например. Windows, Linux и т.д. Теперь предположим, что интерфейс fopen выглядит примерно так

FILE VFS_File_Open( const unsigned char* strFile, int flags );

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

FILE VFS_File_Open( const unsigned char strFile, int flags )
{
int OS = getOSID();

if (0S == 1)
  //implement here the system calls required to open a file on a WIN OS
else if (OS == 2)
  //implement here the system calls required to open a file on a Linux OS
etc  
}

ИЗМЕНИТЬ:

Теперь мне интересно, знает ли кто-нибудь, где я могу найти системные вызовы файловых операций для Windows? Их легко найти для Linux, но я изо всех сил пытался найти что-то подобное для Windows, например. Мне были бы интересны системные вызовы для открытия файла, записи файла и т. д.

Еще одно примечание: C stdio.h предлагает ряд стандартных операций ввода-вывода, таких как

FILE * fopen (const char *filename, const char *opentype)

Другими словами, мне не нужно переопределять подпрограмму fopen в моей VFS, поскольку библиотека Gnu C позаботится о том, с какой ОС она работает, верно? Мне просто нужно реализовать функции, которые не поддерживаются библиотекой stdio, например. создание каталогов, которые отличаются от файловой системы к файловой системе?

Спасибо

01.09.2009

  • ваш вопрос неясен относительно того, нужен ли вам виртуальный переключатель файловой системы для многих разных файловых систем (EXT2, FAT) или вы хотите переключаться между операционными системами. 20.11.2016

Ответы:


1

Возможно, самой простой/чистой реализацией было бы создание двух отдельных библиотек, одной для Windows и одной для Linux, без засорения кода каскадными операторами if и switch. Библиотеки будут реализовывать одни и те же функции, определенные в общем заголовке.

Кроме того, помните, что код внутри вашего чека OS == something будет скомпилирован и связан во всех системах, так что, например. библиотека, скомпилированная в Linux, должна иметь возможность разрешать системные вызовы Windows...

Я думаю, что разделение вещей (разные ОС, разные файлы cpp) — самое простое решение.

ИЗМЕНИТЬ:

Если вы используете C++, почему бы просто не положиться на потоки? Стандартная библиотека уже предоставляет функции, которые вы пытаетесь реализовать, и доступна на всех платформах.
В противном случае, вот ссылка на Функции управления файлами Windows.

ВТОРОЕ РЕДАКТИРОВАНИЕ:

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

01.09.2009
  • Мне нравится идея с общим заголовком и разными библиотеками для разных ОС. По сути, я должен просто сделать то, что предложил Ник Д., и включить соответствующую библиотеку в зависимости от ОС. 01.09.2009
  • Точнее, когда вы создаете решение для Windows, вы связываете библиотеку Windows и так далее. Вы включаете общий заголовок в обоих случаях: компиляция будет одинаковой, на этапе связывания будут учитываться особенности платформы. 01.09.2009

  • 2

    Я не думаю, что вы сможете скомпилировать модуль для разных ОС так, как вам хочется.

    // Make the distinction at compile time,
    
    FILE VFS_File_Open( const unsigned char strFile, int flags )
    {
    #ifdef _WINDOWS
        //implement here the system calls required to open a file on a WIN OS
    #endif
    #ifdef _LINUX
        //implement here the system calls required to open a file on a Linux OS
    #endif
        etc
    }
    
    01.09.2009
  • Конечно, если вы хотите хранить все в одном файле, различие должно быть сделано во время компиляции (+1). Я все еще думаю, что разделение вещей лучше. 01.09.2009
  • Большое Вам спасибо. Это тоже был один из подходов, о котором я думал! Так что комбинация с ответом orsogufo должна дать мне хороший старт! 01.09.2009
  • Да, я согласен. На самом деле это общий шаблон для разработки кроссплатформенных проектов. 01.09.2009

  • 3

    Вы можете попробовать библиотеку PhysicsFS.

    01.09.2009
  • ОП спрашивал, как реализовать виртуальную файловую систему, а не просил предложений по библиотекам. 15.05.2017

  • 4

    На самом деле реализовано это, поэтому из опыта здесь:

    Первое, что нужно сделать, это использовать классы. Нет эквивалента fopen(). Если есть флаги, они будут перечислением. В настоящее время имена файлов wchar_t.

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

    01.09.2009

    5

    Стандарт C не имеет такой возможности. Обратите внимание, что понятие «конкретная ОС» также немного расплывчато: Windows XP и Windows Vista — это одна и та же «конкретная ОС» или разные? CentOS и Ubuntu — это одна и та же ОС или разные?

    По-видимому, вы ищете только различия API, поэтому в большинстве случаев вы, вероятно, можете игнорировать различия версий и различий в дистрибутивах (хотя и в Windows, и в Linux время от времени появляются новые системные вызовы). В этом случае лучше использовать условную компиляцию препроцессора, поскольку код, выполняющий специфичные для Linux вызовы, даже не будет компилироваться в Windows.

    Традиционно системные компиляторы предопределяют различные макросы. Вот несколько таких макросов для соответствующих систем: _WIN32, __linux, __linux__, __AIX__, __hpux, ... Если вам нужно идентифицировать конкретную систему, вам следует снова спросить на SO.

    01.09.2009

    6

    Если вы ищете способ абстрагироваться от свойств файловой системы, которую вы используете (разделители путей и т. д.), и если вас устраивает решение только на C++, взгляните на Boost.Filesystem.

    Пути могут быть указаны в переносимом общем формате пути (в основном в формате POSIX) и автоматически преобразуются в исходный формат:

    path my_path( "some_dir/file.txt" );
    

    Элементы могут быть объединены в путь с помощью оператора /, а результат может быть напрямую использован для открытия файла:

    ifstream file1( my_path / "foo/bar" );
    

    Более того, эта функциональность является частью технического отчета 2, а это означает, что она, скорее всего, войдет в стандартную библиотеку.

    01.09.2009
    Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]