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

Вниз

Закрытие файла...   Найти похожие ветки 

 
brother ©   (2011-12-22 20:01) [0]

Гарантирется ли закрытие файла и доступ к нему при конструкциях?:
...TStringList.Create;
...SaveToFile(s);
...Free;

и
TIniFile.Create...
Write...
...Free;

просто есть код записи и чтения (в пределах одного приложения) в файлы этих типов, но потом, эти файлу ВРОДЕ как не доступны (возможно ли все еще заняты и до них нет доступа даже в режиме только чтение), или всеж надо искть баг в коде доступа открытия на чтение этих фалов)... надо выяснить, что к чему...


 
И. Павел ©   (2011-12-23 08:36) [1]

> brother ©   (22.12.11 20:01)

Конструкции ведь обернуты в try/finally или with?


 
han_malign   (2011-12-23 09:03) [2]


> Конструкции ведь обернуты в try/finally

- надеюсь ошибки не маскируются безусловным try/except end?

> ...TStringList.Create;
> ...SaveToFile(s);
> ...Free;

- SaveToFile(s) - по отношению к файлу - атомарная оперция(в контексте одного потока, естественно)

TIniFile - использует WritePrivateProfileString() - функция также атомарна по отношению к файлу...

То есть - в обоих случаях время жизни объектов не важно...


 
Anatoly Podgoretsky ©   (2011-12-23 15:29) [3]

Не гарантируется.


 
Ega23 ©   (2011-12-23 15:35) [4]


> Не гарантируется.


Почему???

procedure TStrings.SaveToFile(const FileName: string; Encoding: TEncoding);
var
 Stream: TStream;
begin
 Stream := TFileStream.Create(FileName, fmCreate);
 try
   SaveToStream(Stream, Encoding);
 finally
   Stream.Free;
 end;
end;


 
Anatoly Podgoretsky ©   (2011-12-23 17:14) [5]


> Почему???

Потому что у него ни каких try finally нет


 
Dennis I. Komarov ©   (2011-12-23 18:44) [6]

Вроде как сам TStrings к файлу то отношения не имеет. Я за Легыча [4].
А вот TIni - надо код показать...


 
DVM ©   (2011-12-23 22:42) [7]

Я как то сталкивался с ситуациями, когда сразу (буквально следующей строкой) после кода аналогичного [4], файл оказывался залочен, причем намертво, на доли секунды и его нельзя было из того же потока вновь открыть на запись, удалить, переместить. Т.е файл вроде бы закрыт, но не свободен. Грешил на антивирусы. Проявлялось очень редко, благо не часто требуется сразу после закрытия файла что-то с ним делать.


 
Rouse_ ©   (2011-12-23 23:16) [8]

Не гарантируется в любом случае...


 
Dennis I. Komarov ©   (2011-12-23 23:26) [9]


> Rouse_ ©   (23.12.11 23:16) [8]

Эм... Обоснуй...


 
Rouse_ ©   (2011-12-24 11:14) [10]

На память не вспомню, но в MSDN где-то было что файл буде залочен до окончания сброса буффера


 
Dennis I. Komarov ©   (2011-12-24 13:42) [11]


> файл буде залочен до окончания сброса буффера

про какой буфер речь?


 
Rouse_ ©   (2011-12-24 23:26) [12]

Что значит какой? Тот в который пишутся данные, они ж не напрямую на диск сразу идут...


 
Dennis I. Komarov ©   (2011-12-25 01:06) [13]


> Что значит какой? Тот в который пишутся данные, они ж не
> напрямую на диск сразу идут...

Разумеется. Вот я и спросил, какой... Есть Кэш на винте, есть какая-нить прослойка в операционке, диск может быть как и на удаленной тачке и совсем не Win, так и на RAM диске...


 
Anatoly Podgoretsky ©   (2011-12-25 10:43) [14]

Да какая разница какой, знание не поможет.


 
brother ©   (2011-12-26 08:44) [15]

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

> Конструкции ведь обернуты в try/finally

да


 
Inovet ©   (2011-12-26 10:53) [16]

> [15] brother ©   (26.12.11 08:44)
> можно считать, что гарантирует, ибо сброс с буфера на винт
> практически мгновенный...

"Практически" не считается, если процедура закрытия файла возвращает управление до его освобождения.


 
Rouse_ ©   (2011-12-26 14:08) [17]

Вообще на вскидку почему файл может быть залочен после вызова CloseHandle:
1. CloseHandle вернула ошибку
2. выполняется асинхронная операция записи/чтения
3. не скинут файловый кэш
4. количество дескрипторов на файл не равно нулю.
5. изменились права доступа к файлу

В втором и третьем случае CloseHandle не ждет окончания операции...
Еще нужно почитать Соломона/Руссиновича, там точно было что-то по этому поводу, но искать лениво...



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

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

Наверх





Память: 0.48 MB
Время: 0.002 c
2-1324830541
Wanderer
2011-12-25 20:29
2012.04.22
Writefile, TList и динамические переменные


15-1324457180
Mysql_error
2011-12-21 12:46
2012.04.22
Настроить коннет к mysql с разных компьютеров


15-1324223374
wl
2011-12-18 19:49
2012.04.22
подарите iPad


15-1324204018
oldman
2011-12-18 14:26
2012.04.22
Не хватает снега?


2-1325061895
гия
2011-12-28 12:44
2012.04.22
Пграмма "замерзает" пока TThread не завершится





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский