Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.07.06;
Скачать: [xml.tar.bz2];

Вниз

Файл занят другим приложением   Найти похожие ветки 

 
ciborg   (2008-06-09 14:10) [0]

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


 
Поросенок Винни-Пух ©   (2008-06-09 14:13) [1]

проверять бесполезно.


 
Игорь Шевченко ©   (2008-06-09 14:15) [2]

const
maxcnt = 360; //Ждем 6 минут максимум
var
fd: Integer;
ofs: _OFSTRUCT;
err: DWORD;
cnt: Integer;
begin
cnt := 0;
repeat
  Inc(cnt);
  FillChar(ofs, SizeOf(ofs), 0);
  ofs.cBytes := SizeOf(ofs);
  fd := OpenFile(PChar(FileName), ofs, OF_SHARE_EXCLUSIVE);
  err := GetLastError;
  if err <> ERROR_SHARING_VIOLATION then
    Break;
  Sleep(1000);
until cnt >= maxcnt;
CloseHandle(fd);
if err <> ERROR_SUCCESS then
  raise Exception.Create(SysErrorMessage(err))


 
Anatoly Podgoretsky ©   (2008-06-09 14:15) [3]

> ciborg  (09.06.2008 14:10:00)  [0]

> при открытии выдается ошибка

Вот это и обработать, только проверять не надо.


 
ciborg   (2008-06-09 14:16) [4]

почему?


 
Поросенок Винни-Пух ©   (2008-06-09 14:19) [5]

потому что после успешной проверки и перед открытием никто не гарантирует, что он снова не будет занят другим процессом


 
Поросенок Винни-Пух ©   (2008-06-09 14:25) [6]

- папа, дай денег на мороженное.
- дам, только сначала сходи в магазин, посмотри, что там оно есть.

(идешь зимой в гору за пять км в магазин, убеждаеешься, что мороженное есть, возвращаешься к папе)

- папа, мороженное есть!
- на, держи.

(идешь зимой в гору за пять км в магазин, убеждаеешься, что все мороженное раскупили, возвращаешься к папе усталый, но уже мудрый)


 
ciborg   (2008-06-09 15:08) [7]


> Поросенок Винни-Пух ©   (09.06.08 14:19) [5]
> потому что после успешной проверки и перед открытием никто
> не гарантирует, что он снова не будет занят другим процессом


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


 
Palladin ©   (2008-06-09 15:10) [8]

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


 
Поросенок Винни-Пух ©   (2008-06-09 15:19) [9]

которая проверяет занят файл или нет и после этого сразуже блокирует его, если свободен.

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


 
Anatoly Podgoretsky ©   (2008-06-09 15:20) [10]

> Palladin  (09.06.2008 15:10:08)  [8]

Есть и тебе даже привели готовый код.


 
Поросенок Винни-Пух ©   (2008-06-09 15:22) [11]

он щас тот кусок скопирует, оформит в функцию и будет думать, что поймал судьбу за что-то.


 
Тын-Дын ©   (2008-06-09 15:27) [12]


> Поросенок Винни-Пух ©   (09.06.08 15:22) [11]
> он щас тот кусок скопирует, оформит в функцию и будет думать,
>  что поймал судьбу за что-то.


Угу, а некоторые будут комментировать то, чего нет.


 
Поросенок Винни-Пух ©   (2008-06-09 15:41) [13]

Тагда уж что-то типа такого

const
maxcnt = 360; //Ждем 6 минут максимум

type TMyCallBack = procedure (F : File);

function CheckFileExclusive(ACallback : TMyCallback) : boolean
var
fd: Integer;
ofs: _OFSTRUCT;
err: DWORD;
cnt: Integer;
begin
result := False;
cnt := 0;
repeat
 Inc(cnt);
 FillChar(ofs, SizeOf(ofs), 0);
 ofs.cBytes := SizeOf(ofs);
 fd := OpenFile(PChar(FileName), ofs, OF_SHARE_EXCLUSIVE);
 err := GetLastError;
 if err <> ERROR_SHARING_VIOLATION then
   begin
    Result := True;
    Break;
   end;
 Sleep(1000);
until cnt >= maxcnt;

if Result and Assigned(ACallback) then ACallback(fd);

CloseHandle(fd);
if err <> ERROR_SUCCESS then
 raise Exception.Create(SysErrorMessage(err))
end;


 
ciborg   (2008-06-09 15:49) [14]

круто


 
Игорь Шевченко ©   (2008-06-09 15:49) [15]

А звчем вообще открывать файлы, занятые другими приложениями ?


 
ciborg   (2008-06-09 17:14) [16]


> Игорь Шевченко ©   (09.06.08 15:49) [15]
> А звчем вообще открывать файлы, занятые другими приложениями
> ?


Как зачем? Чтобы получить данные из этих файлов.


 
Игорь Шевченко ©   (2008-06-09 17:19) [17]


> Как зачем? Чтобы получить данные из этих файлов


Зачем нужны данные из файлов, открытых другими приложениями ? Это нонсенс


 
Тын-Дын ©   (2008-06-09 20:14) [18]


> Игорь Шевченко ©   (09.06.08 17:19) [17]
> > Как зачем? Чтобы получить данные из этих файловЗачем нужны
> данные из файлов, открытых другими приложениями ? Это нонсенс


Например, просмотр протокола другой программы в real-time...


 
Игорь Шевченко ©   (2008-06-09 20:52) [19]


> Например, просмотр протокола другой программы в real-time.
> ..


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

Почему в линуксе такое странное расположение знаков препинания по умолчанию...


 
tesseract ©   (2008-06-09 21:04) [20]


> Например, просмотр протокола другой программы в real-time.
> ..


А другая программа даёт тебе на это право ? Может она эксклюзивно для себя логи держит ? Или такой же горе-программер этой софтины про FILE_SHARE_READ не слышал.


 
Тын-Дын ©   (2008-06-09 21:14) [21]


> tesseract ©   (09.06.08 21:04) [20]
> > Например, просмотр протокола другой программы в real-time.
> > ..А другая программа даёт тебе на это право ? Может она
> эксклюзивно для себя логи держит ?


Может быть. И что?


> Или такой же горе-программер этой софтины про FILE_SHARE_READ
> не слышал.


Может быть такой же горе-читатель не понимает, о чем разговор? Или не читал ветку?
Тогда не след соваться в разговор.

PS.
Ответ был на [17]
Если решишь прочитать ветку, то промотни до этого поста.


 
Игорь Шевченко ©   (2008-06-09 21:18) [22]


> Или не читал ветку?
> Тогда не след соваться в разговор.


Тут кто-то цитировал правила конференции о том, что нефигово бы вежливыми быть.


 
Тын-Дын ©   (2008-06-09 21:23) [23]


> Тут кто-то цитировал правила конференции о том, что нефигово
> бы вежливыми быть.


А посмотри в предыдущем посте про горе-программера?


 
Anatoly Podgoretsky ©   (2008-06-09 22:06) [24]

Пусть автор поговорит, вы то зачем ругаетесь?



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.07.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.057 c
15-1211464998
Правильный_Вася
2008-05-22 18:03
2008.07.06
хитрое переименование файлов


15-1211630959
NValera
2008-05-24 16:09
2008.07.06
IPv4 контрольная сумма


2-1212728035
кот
2008-06-06 08:53
2008.07.06
Ibqshared


15-1211436673
Caks
2008-05-22 10:11
2008.07.06
конвертация из basic в delphi


2-1212792183
redlord
2008-06-07 02:43
2008.07.06
отображение каретки ввода в компоненте edit





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский