|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
05.07.2009, 11:00 | #1 |
Новичок
Джуниор
Регистрация: 05.07.2009
Сообщений: 2
|
Надежный перенос файлов (win32api, win2000+)
Требуется помощь в организации надежного переноса файлов (win200+). Файлы могут быть большие и маленькие, как внутри одной файловой системы так и между разными, быть уже сформированными либо формироваться неизвестными способами (в т.ч. через множество открытия-закрытия файла) еще в процессе попытки переноса (в последнем случае должна генерироваться ошибка). Файловые системы и сетевые ресурсы - различные (fat32, ntfs, микрософтовская шара, сетевой ресурс Novell Netware (традиционная ФС, nss))
Хочется вцепиться в файл и гарантированно перенести его. Если файл еще в процессе формирования и просто формирующая его программа закрыла его на микросекунду - это проблемы этой программы. Ну и чтобы не получилось что этот файл открыт кем-то для чтения и поэтому неможет быть удален/перенесен (в этом случае должна (очень желательно) выдаваться ошибка без бесполезной передачи данных на другую ФС/сетевой ресурс) Пробовал использовать MoveFileEx, но к сожалению он копирует файлы которые в данный момент даже еще записываются. В результате на выходе получаем не реальный файл, а огрызок от него. Если файл просто открыт кем-либо для чтения - емнип тоже пытается переносить. Если открывать файл эсклюзивно , то афаик потом можно только заниматься копированием вручную, но тут ожидает еще 2 проблемы: 1) если файл переносится внутри одной ФС/сетевого ресурса используя копирование "вручную" с последующим удалением оригинала то потребуется дополнтельное место в каталоге назначения, которого может не оказаться. MoveFileEX же в этом случае просто перенесет файл из одного каталога в другой и все будет с точки зрения свободного места и загрузки оборудования/сети красиво. 2) самая главная проблема: вопрос удаления исходного файла после попытки копирования. Как я понимаю, перед тем как удалить файл - нужно его закрыть. Вот тут возникает вопрос "а не успеет ли какая-то другая программа изменить этот файл между его копированием и удалением?". |
07.07.2009, 00:08 | #2 | |
Форумчанин
Регистрация: 29.05.2009
Сообщений: 320
|
Цитата:
fStream := TFileStream.Create(fName, fmOpenRead, fmShareExclusive) флаг fmShareExclusive устанавливает монопольный режим и другое приложение не сможет читать/писать в этот файл. Вот, значит, копировать тоже лучше используя потоки. Поток - это достаточно высокая абстракция, как и сокет. Поэтому если речь идет о ФС, разных ОС, то лучше использовать их. |
|
08.07.2009, 08:11 | #3 |
Новичок
Джуниор
Регистрация: 05.07.2009
Сообщений: 2
|
Насколько я понимаю, это не избавляет от проблемы пункта 1, и уж тем более (самое главное) - пункта 2. После кпирования поток сначала надо будет закрыть, а только потом удалить файл. А если между закрытием потока и удалением в файл кто-либо запишет?
|
08.07.2009, 09:39 | #4 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Та же проблема. Пока что выхожу так:
Мониторю изменения в директории и веду БД. В конце дня копирую файлы у которых дата изменения близка к сегоднящней. В идеале нужно делать зеркальный сервак. Впрочем можно организовать отдельный поток который бы проверял, закрыт ли файл и если закрыт - копироватьего.
I'm learning to live...
|
09.07.2009, 17:38 | #5 | |
Форумчанин
Регистрация: 29.05.2009
Сообщений: 320
|
Цитата:
И насчет 1) тоже наверно плохо понял (блин), но может использовать копирование через ОЗУ? |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Программа получения списка файлов директории и изменения атрибутов файлов | roma86 | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 7 | 09.06.2009 09:08 |
Как задать команду загрузки файлов данных на кнопку если каталог и имена файлов известны??? | Andbuba | Microsoft Office Excel | 2 | 28.12.2008 17:28 |
Майкрософт продолжает информационно поддерживать Win32API | mogul82 | Win Api | 8 | 04.11.2008 16:54 |
Нужна помощь: выбор файлов исходя из имени файлов | Antik163RUS | Помощь студентам | 4 | 19.06.2008 21:20 |
Перенос нескольких файлов посредством VBA | Victor | Microsoft Office Excel | 5 | 09.12.2007 23:25 |