Изящное чтение файлов без блокировки

Обзор доски

Ниже представлены изображения 1000 x 750 пикселей, ~ 130 КБ JPEG , размещенные на ImageShack .


Дополнительная информация

Я должен упомянуть, что каждый пользователь (клиентских ящиков) будет работать прямо с общего ресурса / Foo . Из-за особенностей бизнеса пользователям никогда не нужно будет одновременно просматривать документы друг друга или работать с ними, поэтому конфликты такого характера никогда не будут проблемой. Доступ должен быть как можно более простым, что, вероятно, означает сопоставление диска с их соответствующим подкаталогом / Foo / username .

Кроме того, никто, кроме моих приложений (собственных и на сервере) будут напрямую использовать каталог FTP.

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


Проблема

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

Пока я передаю файл за пределы сайта, мне необходимо запретить пользователям писать в файл (например, использовать CreateFile с FILE_SHARE_READ или что-то в этом роде), пока я читаю оттуда. Скорость исходящего потока Интернета в их офисе далеко не симметрична размерам файлов, с которыми они будут работать, поэтому вполне возможно, что они вернутся к файлу и попытаются изменить его, пока я все еще читаю из него.


Возможное решение

Самым простым решением вышеупомянутой проблемы было бы создать копию рассматриваемого файла (ов) в другом месте файловой системы и без помех передать эти «снимки».

Файлы ( некоторые из них будут двоичными), с которыми эти ребята будут работать, относительно малы, вероятно, ≤20 МБ, поэтому их копирование (и, следовательно, временная блокировка) будет почти мгновенным. Вероятность того, что они попытаются записать в файл в тот же момент, когда я его копирую, должна быть близка к нулю.

Это решение кажется некрасивым, и я почти уверен, что есть лучший способ справиться

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


Вопросы

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

Я ' m заинтересованы в чистых решениях, которые не требуют чрезмерного усложнения реализации. Возможно, я пропустил что-то в WinAPI, которое изящно решает эту проблему?

Я еще не решил, в чем буду писать это, но мне комфортно: C, C ++, C #, D и Perl.

8
задан fulcrum 19 February 2011 в 23:29
поделиться