Да, я хочу прочитать простой файл журнала в TStringList, и это легко сделать с помощью LoadFromFile. Но проблема в том, что файл может быть открыт другой программой одновременно, поэтому может возникнуть исключение. Я пробовал использовать:
FileMode := fmShareCompat;
Но это не сработает.
Я также пробовал использовать:
fFilePath := fPathList[PathIndex] + '\' + FileData.Name;
AssignFile(vFile, fFilePath);
Reset(vFile, 1); // Recordsize = 1
SetLength(vFileString, FileData.Size);
BlockRead(vFile, vFileString, FileData.Size);
vCurrentFile.Text := vFileString;
Он вызывает EInOutError с сообщением об ошибке ввода-вывода 998.
Любое предложение ?





Попробуйте LoadFromStream и сделайте что-нибудь вроде:
fileStream := TFileStream.Create(aFileName, fmShareDenyNone);
myTStringList.LoadFromStream(fileStream);
fileStream.Free();
Исправление: Разрушение вполне приемлемо в приведенном выше примере. MyObject.Free эквивалентен if MyObject <> nil then MyObject.Destroy. Причина, по которой вы используете Free, заключается в том, чтобы проверить, назначена ли ссылка. В приведенном выше примере вы можете безопасно гарантировать, что, достигнув строки 3, fileStream ссылается на объект, который был правильно создан. Однако чего не хватает (гораздо более серьезная проблема), так это заявления try..finally. Кроме того, в зависимости от области действия переменной fileStream, может быть целесообразно очистить ее: finally fileStream.Destroy; fileStream := nil; end;
перед тем, как начнется обсуждение Free или Destroy, вы можете прочитать это: blogs.embarcadero.com/abauer
Меня всегда как-то смущало, почему доступно два метода, и, честно говоря, я почти в каждом случае использую Destroy вместо Free. Это связано с тем, что в тех случаях, когда я не назначил объект, будет генерироваться исключение, поэтому ошибки обнаруживаются быстрее.
Я не нашел обсуждения в блоге Аллена Бауэра. Почему-то я подумал, что вызывать и Destroy тоже плохо. (комментарий inzKulozik). Я не знал, что вызывать напрямую - безопасно.
Кроме того, попробуй ... кроме и попробуй ... наконец, в это время мы хорошие друзья. Инкапсулируйте код чтения файла в эти типы блоков и расскажите пользователю о возникающей проблеме.
Да, я знаю. Но я хочу найти много файлов журналов в каталоге. Если у меня есть попытка, кроме каждой загрузки файла, возможно, это замедлит выполнение. Это уже довольно медленно ... / Роланд
На самом деле вам нужно попробовать / наконец-то для каждого файла. Если вы не читаете много действительно маленьких файлов, я не вижу, чтобы это сильно влияло на производительность. Если это так, то вы, возможно, захотите все вместе рассмотреть другой механизм.
@Niklas: НЕТ! НЕТ! НЕТ! и снова НЕТ! Не злоупотребляйте, попробуйте .. кроме! Скрытие ошибок с помощью try..except в конечном итоге приводит к огромному количеству коварных ошибок.
@ Крэйг Янг: Вы пропустили ту часть моего ответа, которая гласит: «... и рассказать пользователю о возникающей проблеме»? Это не сокрытие ошибок, а изящная обработка их в моей книге.
fmShareCompat, вероятно, следует пометить как устаревший. Вы хотите fmShareDenyNone (как сказал Дрейц)
Я полагаю, что fmShareCompat появился за 16 дней работы с DOS. В Windows это обрабатывается так же, как fmShareExclusive. Когда поддерживалась Linux, она обрабатывалась так же, как fmShareDenyNone.
Не вызывайте Destroy непосредственно в приложении. Вместо этого вызовите Free, который проверяет, что ссылка TFileStream не равна нулю, и только затем вызывает Destroy.