Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.07.2009, 11:00   #1
alf__19
Новичок
Джуниор
 
Регистрация: 05.07.2009
Сообщений: 2
По умолчанию Надежный перенос файлов (win32api, win2000+)

Требуется помощь в организации надежного переноса файлов (win200+). Файлы могут быть большие и маленькие, как внутри одной файловой системы так и между разными, быть уже сформированными либо формироваться неизвестными способами (в т.ч. через множество открытия-закрытия файла) еще в процессе попытки переноса (в последнем случае должна генерироваться ошибка). Файловые системы и сетевые ресурсы - различные (fat32, ntfs, микрософтовская шара, сетевой ресурс Novell Netware (традиционная ФС, nss))
Хочется вцепиться в файл и гарантированно перенести его. Если файл еще в процессе формирования и просто формирующая его программа закрыла его на микросекунду - это проблемы этой программы. Ну и чтобы не получилось что этот файл открыт кем-то для чтения и поэтому неможет быть удален/перенесен (в этом случае должна (очень желательно) выдаваться ошибка без бесполезной передачи данных на другую ФС/сетевой ресурс)
Пробовал использовать MoveFileEx, но к сожалению он копирует файлы которые в данный момент даже еще записываются. В результате на выходе получаем не реальный файл, а огрызок от него.
Если файл просто открыт кем-либо для чтения - емнип тоже пытается переносить. Если открывать файл эсклюзивно , то афаик потом можно только заниматься копированием вручную, но тут ожидает еще 2 проблемы:
1) если файл переносится внутри одной ФС/сетевого ресурса используя копирование "вручную" с последующим удалением оригинала то потребуется дополнтельное место в каталоге назначения, которого может не оказаться. MoveFileEX же в этом случае просто перенесет файл из одного каталога в другой и все будет с точки зрения свободного места и загрузки оборудования/сети красиво.
2) самая главная проблема: вопрос удаления исходного файла после попытки копирования. Как я понимаю, перед тем как удалить файл - нужно его закрыть. Вот тут возникает вопрос "а не успеет ли какая-то другая программа изменить этот файл между его копированием и удалением?".
alf__19 вне форума Ответить с цитированием
Старый 07.07.2009, 00:08   #2
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Цитата:
2) самая главная проблема: вопрос удаления исходного файла после попытки копирования. Как я понимаю, перед тем как удалить файл - нужно его закрыть. Вот тут возникает вопрос "а не успеет ли какая-то другая программа изменить этот файл между его копированием и удалением?".
Попробуйте открывать файл в монопольном режиме:

fStream := TFileStream.Create(fName, fmOpenRead, fmShareExclusive)

флаг fmShareExclusive устанавливает монопольный режим и другое приложение не сможет читать/писать в этот файл.

Вот, значит, копировать тоже лучше используя потоки. Поток - это достаточно высокая абстракция, как и сокет. Поэтому если речь идет о ФС, разных ОС, то лучше использовать их.
BaronTreep вне форума Ответить с цитированием
Старый 08.07.2009, 08:11   #3
alf__19
Новичок
Джуниор
 
Регистрация: 05.07.2009
Сообщений: 2
По умолчанию

Насколько я понимаю, это не избавляет от проблемы пункта 1, и уж тем более (самое главное) - пункта 2. После кпирования поток сначала надо будет закрыть, а только потом удалить файл. А если между закрытием потока и удалением в файл кто-либо запишет?
alf__19 вне форума Ответить с цитированием
Старый 08.07.2009, 09:39   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Та же проблема. Пока что выхожу так:
Мониторю изменения в директории и веду БД. В конце дня копирую файлы у которых дата изменения близка к сегоднящней.

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

Впрочем можно организовать отдельный поток который бы проверял, закрыт ли файл и если закрыт - копироватьего.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.07.2009, 17:38   #5
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Цитата:
После кпирования поток сначала надо будет закрыть, а только потом удалить файл. А если между закрытием потока и удалением в файл кто-либо запишет?
Не понял этого - думал запретить касания просто после открытия. Тогда скорее всего правда нужно использовать два потока.

И насчет 1) тоже наверно плохо понял (блин), но может использовать копирование через ОЗУ?
BaronTreep вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа получения списка файлов директории и изменения атрибутов файлов 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