Хотите прочитать файл в TStringList

Да, я хочу прочитать простой файл журнала в 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.

Любое предложение ?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
4 072
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Попробуйте LoadFromStream и сделайте что-нибудь вроде:

fileStream := TFileStream.Create(aFileName, fmShareDenyNone);
myTStringList.LoadFromStream(fileStream);
fileStream.Free();

Не вызывайте Destroy непосредственно в приложении. Вместо этого вызовите Free, который проверяет, что ссылка TFileStream не равна нулю, и только затем вызывает Destroy.

inzKulozik 16.01.2009 21:43

Исправление: Разрушение вполне приемлемо в приведенном выше примере. MyObject.Free эквивалентен if MyObject <> nil then MyObject.Destroy. Причина, по которой вы используете Free, заключается в том, чтобы проверить, назначена ли ссылка. В приведенном выше примере вы можете безопасно гарантировать, что, достигнув строки 3, fileStream ссылается на объект, который был правильно создан. Однако чего не хватает (гораздо более серьезная проблема), так это заявления try..finally. Кроме того, в зависимости от области действия переменной fileStream, может быть целесообразно очистить ее: finally fileStream.Destroy; fileStream := nil; end;

Disillusioned 18.12.2009 15:51

перед тем, как начнется обсуждение Free или Destroy, вы можете прочитать это: blogs.embarcadero.com/abauer

Joe Meyer 11.02.2010 08:39

Меня всегда как-то смущало, почему доступно два метода, и, честно говоря, я почти в каждом случае использую Destroy вместо Free. Это связано с тем, что в тех случаях, когда я не назначил объект, будет генерироваться исключение, поэтому ошибки обнаруживаются быстрее.

Drejc 11.02.2010 11:11

Я не нашел обсуждения в блоге Аллена Бауэра. Почему-то я подумал, что вызывать и Destroy тоже плохо. (комментарий inzKulozik). Я не знал, что вызывать напрямую - безопасно.

Warren P 01.02.2011 05:11

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

Да, я знаю. Но я хочу найти много файлов журналов в каталоге. Если у меня есть попытка, кроме каждой загрузки файла, возможно, это замедлит выполнение. Это уже довольно медленно ... / Роланд

Roland Bengtsson 15.01.2009 10:18

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

Jim McKeeth 15.01.2009 12:51

@Niklas: НЕТ! НЕТ! НЕТ! и снова НЕТ! Не злоупотребляйте, попробуйте .. кроме! Скрытие ошибок с помощью try..except в конечном итоге приводит к огромному количеству коварных ошибок.

Disillusioned 18.12.2009 15:56

@ Крэйг Янг: Вы пропустили ту часть моего ответа, которая гласит: «... и рассказать пользователю о возникающей проблеме»? Это не сокрытие ошибок, а изящная обработка их в моей книге.

Niklas Winde 13.01.2010 15:58

fmShareCompat, вероятно, следует пометить как устаревший. Вы хотите fmShareDenyNone (как сказал Дрейц)

Я полагаю, что fmShareCompat появился за 16 дней работы с DOS. В Windows это обрабатывается так же, как fmShareExclusive. Когда поддерживалась Linux, она обрабатывалась так же, как fmShareDenyNone.

Другие вопросы по теме