Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Копирование файла без его блокировки, При вызове CopyFile(Ex) он блокируется.. 
:(
    Опции темы
Slash_from_Rjazan
Дата 27.9.2007, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 11.5.2007

Репутация: нет
Всего: нет



Проблема вот в чем:
Нужно написать программу которая копирует файлы из сетевой папки на локальный компьютер, НО
эти файлы являются dbf файлами в которые постоянно пишутся данные (на удаленном компьютере программа работает через BDE) и при попытке скопировать эти файлы с помощью CopyFile(CopyFileEx) у той программы вываливается сообщение "Table is busy.".
Вопрос: какой ОПТИМАЛЬНЫЙ способ скопировать эти файлы так чтобы они не блокировались?

PS
1. Знаю, что это возможно, т.к. когда эти файлы копируешь через TotalComander, то все OK.
2. Знаю два способа
    1)Используя BDE открыть эти файлы как БД и потом считать данные в целевые файлы 
    2)Используя потоки написать свою процедуру копирования (не факт, что будет работать)
   но предполагаю, что есть метод проще и все уже написано до нас...

3. Предваряя вопросы типа "А зачем это нужно"
 Пишу программу, которая на основе тех БД формирует некоторую статистическую информацию, обработка данных достаточно сложная, поэтому при работе через сеть все происходит ОЧЕНЬ медленно, а при работе с локальными файлами проблем с быстродействием нет. Других вариантов по сбору данных, кроме как в dbf нет.

Заранее благодарен за помощь. 
PM MAIL   Вверх
Rouse_
Дата 27.9.2007, 10:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



Открой файл на чтение и читай из него кусками. Эти куски сохраняй в новый файл.


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Virtuals
Дата 27.9.2007, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: 4
Всего: 11



еще лучше через

var    ST:TFileStream;
...
 ST:=TFileStream.create('Файл.дбф', fmShareDenyNone);
....
пользуем  ST


вроде не должно блокировать
PM MAIL ICQ   Вверх
BaD_SeCt0R
Дата 28.9.2007, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lazy Coder
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 9.10.2006
Где: Анапа

Репутация: 3
Всего: 18



Цитата(Virtuals @  27.9.2007,  15:55 Найти цитируемый пост)
еще лучше через

var    ST:TFileStream;


Цитата(Rouse_ @  27.9.2007,  10:58 Найти цитируемый пост)
Открой файл на чтение и читай из него кусками. Эти куски сохраняй в новый файл.

Разница?


--------------------
Кто владеет информацией - владеет миром. (С) Френсис Бэкон.
PM MAIL ICQ   Вверх
Virtuals
Дата 28.9.2007, 04:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: 4
Всего: 11



Цитата(BaD_SeCt0R @  28.9.2007,  00:43 Найти цитируемый пост)
Разница?

более подробно smile 
PM MAIL ICQ   Вверх
Alexeis
Дата 28.9.2007, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



BaD_SeCt0R, открыть для чтения еше не значит что другие процессы туда смогут писать. fmShareDenyNone - разрешает совместное использование файла несколькими процессами.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
BaD_SeCt0R
Дата 28.9.2007, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lazy Coder
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 9.10.2006
Где: Анапа

Репутация: 3
Всего: 18



Цитата(Alexeis @  28.9.2007,  09:25 Найти цитируемый пост)
BaD_SeCt0R, открыть для чтения еше не значит что другие процессы туда смогут писать.

Ну уж писать в копируемый файл, я думаю, разрешать не надо smile Иначе в конечном файле может быть полная путанница.


--------------------
Кто владеет информацией - владеет миром. (С) Френсис Бэкон.
PM MAIL ICQ   Вверх
Alexeis
Дата 28.9.2007, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



Цитата(BaD_SeCt0R @  28.9.2007,  10:20 Найти цитируемый пост)
Иначе в конечном файле может быть полная путанница. 

  Не факт. Это если это дозапись в конец, то ничего страшного быть не должно. Просто копия не будет содержать самых последних данных. Например, если делается бэкап, то это нормально. Все зависит от того что там и как это синхронизируется с другими данными. Задачи бывают разные, хотя в целом ты прав, чтение с записью это опасная операция. Обычно при записи доступ на чтение блокируется.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Slash_from_Rjazan
Дата 4.10.2007, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 11.5.2007

Репутация: нет
Всего: нет



Спасибо в итоге сделал вот такую функцию -- ее работоспособность меня вполен устраивает:
Код

function FileCopy(Const SourceFileName, TargetFileName: String) : boolean;
var
 S,T   : TFileStream;
begin
 try
  S := TFileStream.Create(sourcefilename, fmOpenRead or fmShareDenyNone);
  T := TFileStream.Create(targetfilename, fmCreate);
  T.CopyFrom(S, S.Size ) ;
  FileSetDate(T.Handle, FileGetDate(S.Handle));
  Result := True;
  S.Free;
  T.Free;
 except on xError : Exception do begin
   WriteToLog(xError.Message);
   Result := False;
  end;
 end;
end;

PM MAIL   Вверх
EvilsInterrupt
Дата 4.10.2007, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 1
Всего: 9



Slash_from_Rjazan, Раз радует, значит хорошо! ;) Можно же до бесконечности улучшать, но ведь когда-то и останавливаться надо! ;) Но я бы сделал на WinAPI, ну не люблю я юзать компоненты без лишней надобности ;)
PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0580 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.