Чтение и передача больших файлов с помощью C - PullRequest
2 голосов
/ 13 ноября 2010

Я заинтересован в написании утилиты, которая модифицирует файлы PostScript.Он должен пройти по файлу, принять определенные решения о количестве страниц и размерах, а затем записать вывод в файл или стандартный вывод, внеся определенные изменения в код PostScript.

Что было бы хорошим способом обработки файлаобработка в системе * NIX в этом случае?Я довольно новичок в каналах и разветвлениях в C, и я понимаю, что в случае чтения файла напрямую, я мог бы искать назад и вперед по входному файлу, но если входные данные напрямую передаются в программу, яне может просто перемотать к началу ввода, так как ввод может быть, например, сетевым потоком, правильно?

Вместо того, чтобы хранить весь файл PS в памяти, которая может вырасти огромной, кажется, чтоимеет больше смысла буферизовать входные данные на диск, выполняя мой первый проход анализа страниц, затем перечитать из временного файла, произвести вывод и удалить временный файл.Если это жизнеспособное решение, где было бы хорошее место для хранения такого файла в системе * NIX?Я не уверен, насколько безопасен такой код: программа может потенциально использоваться несколькими пользователями на одном сервере.Похоже, я бы обязательно сохранил файл где-нибудь во временном каталоге, уникальном для данной учетной записи пользователя, а также дал бы временному файлу на диске довольно уникальное имя.

Буду признателен за любые советы и указания поэтот безумный загадочный мир обработки файлов.

Ответы [ 3 ]

4 голосов
/ 13 ноября 2010

Используйте mkstemp(3) для создания вашего временного файла. Он будет решать проблемы параллелизма для вас. mmap(2) позволит вам свободно перемещаться по файлу.

1 голос
/ 13 ноября 2010

/ tmp - это временный каталог в системах Unix.Это указано FHS.Он очищается при перезагрузке системы.

Если вам нужно более постоянное хранилище данных, чем / var / tmp, который не очищается после перезагрузки.Также FHS.

http://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard

1 голос
/ 13 ноября 2010

если входные данные напрямую передаются в программу, я не могу просто перемотать назад к началу ввода, поскольку вход может быть, например, сетевым потоком, верно?

Этоправильный.Вы можете выполнять произвольный доступ только к файлу.

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

...