|
|
|
Корректное чтение файлов, в которые периодически заняты сторонним приложением.
|
|||
|---|---|---|---|
|
#18+
Есть программы, которые периодически скидывают данные в текстовые файлы, есть одна программа, которая периодически эти данные считывает. Записываются файлы классическим WriteLn, считываются TSringList.LoadFromFile(); Но! Иногда при считывании вылетала ошибка о том, что файл открыт на запись (что логично), на данный момент обыграл функцией проверяющей доступность файла, вроде не вылетает ошибка, но может просто везет. функция проверки доступности FileIsUse Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. В коде делают так Код: pascal 1. 2. Но как-то сомнения, что так правильно. Ну и обратный вопрос LoadFromFile() не блокирует файл для записи? (что гораздо страшнее, так записывающую программу ломать очень не хочется) _Vasilisk_ Андрей Игоревич Код: pascal 1. Делаю так из соображений, что запись происходит в файл крайне редко (раз в десятки минут, гарантированно не чаще), если этот момент пропустить - чтение однозначно будет произведено, чтение однозначно занимает милисекунды. На всех форумах предлагают варианты с обработкой исключений, но неужели иначе нельзя. И насколько правильно обрабатывать исключения в потоках? Никаких подводных камней? В принципе в случае, если файл недоступен мне просто надо подождать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2019, 18:46 |
|
||
|
Корректное чтение файлов, в которые периодически заняты сторонним приложением.
|
|||
|---|---|---|---|
|
#18+
так не поможет? Код: pascal 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2019, 18:50 |
|
||
|
Корректное чтение файлов, в которые периодически заняты сторонним приложением.
|
|||
|---|---|---|---|
|
#18+
Квейд так не поможет? Так, либо не откроет, при активном писателе, либо заблокирует возможность писать на время чтения. fmShareDenyNone нужно, это разрешит чтение во время записи и не будет блокировать писателя, если он не открывает файл с эксклюзивными правами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2019, 18:59 |
|
||
|
Корректное чтение файлов, в которые периодически заняты сторонним приложением.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич LoadFromFile() не блокирует файл для записи? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ответ - да, блокирует Андрей Игоревич Делаю так из соображений, что запись происходит в файл крайне редко (раз в десятки минут, гарантированно не чаще), если этот момент пропустить - чтение однозначно будет произведено, чтение однозначно занимает милисекунды. 1. Вы вызвали FileIsUse. Файл был свободен. 2. Другая программа заняла файла 3. Вы вызвали ListFile.LoadFromFile(FilePath); и получили исключение. Андрей Игоревич И насколько правильно обрабатывать исключения в потоках? Никаких подводных камней? Проблема у вас совсем в другом. Не как открыть файл, а как не поломать пишущую программу. Потому, что если вы откроете эксклюзивно файл, а в это время в этот файл понадобиться что-то записать, то писатель сильно огорчится. Как я бы решал задачу: Правильно и универсально - доступ к файлу синхронизирован общим мьютексом. Тогда каждый будет ждать, когда второй файл закроет. Правильно, но не универсально. Исходим из утверждения Андрей Игоревич что запись происходит в файл крайне редко Вызвал бы ReadDirectoryChangesW() с маской, скажем FILE_NOTIFY_CHANGE_LAST_WRITE (или FILE_NOTIFY_CHANGE_LAST_ACCESS - нужно смотреть, что будет адекватнее), дождался бы окончания записи и спокойно прочитал бы файл Не правильно, не универсально, но быстро Дважды прочитал бы файл без монопольного доступа. Если два раза была считана одна и та же информация - файл прочитан корректно Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2019, 19:58 |
|
||
|
Корректное чтение файлов, в которые периодически заняты сторонним приложением.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич На всех форумах предлагают варианты с обработкой исключений, но неужели иначе нельзя. И насколько правильно обрабатывать исключения в потоках? Никаких подводных камней? Никаких камней, все как везде - главное не писать в общие данные одновременно. ... Ты не борись с ситуацией, а не создавай её. Пусть "пишущие" приложение пишет в один файл, а "читающее" - читает из другого. Первое пусть пишет в файл с расширением .pre, потом закрывает файл и переименовывает - меняет расширение на .ready, а второе читает из готового *.ready файла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2019, 20:00 |
|
||
|
Корректное чтение файлов, в которые периодически заняты сторонним приложением.
|
|||
|---|---|---|---|
|
#18+
ёёёёё Андрей Игоревич На всех форумах предлагают варианты с обработкой исключений, но неужели иначе нельзя. И насколько правильно обрабатывать исключения в потоках? Никаких подводных камней? Никаких камней, все как везде - главное не писать в общие данные одновременно. ... Ты не борись с ситуацией, а не создавай её. Пусть "пишущие" приложение пишет в один файл, а "читающее" - читает из другого. Первое пусть пишет в файл с расширением .pre, потом закрывает файл и переименовывает - меняет расширение на .ready, а второе читает из готового *.ready файла. Пишущая программа мне почти недоступна, вносить туда правки сложное дело. Хотя конкретно такую правку может и договорюсь внести, вроде ничего радикального. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2019, 20:18 |
|
||
|
Корректное чтение файлов, в которые периодически заняты сторонним приложением.
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Андрей Игоревич LoadFromFile() не блокирует файл для записи? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ответ - да, блокирует Тут ок, сделаю через TFileStream.Create(name, fmOpenRead or fmShareDenyNone ), просто удивлен, зачем его тут для записи открывают, если для записи есть SaveToFile; _Vasilisk_ Сценарий: 1. Вы вызвали FileIsUse. Файл был свободен. 2. Другая программа заняла файла 3. Вы вызвали ListFile.LoadFromFile(FilePath); и получили исключение. Ну по такому сценарию файл может быт заблокирован прям в процессе чтения, тогда уж, действительно, ничего кроме исключения не спасет. _Vasilisk_ Правильно и универсально - доступ к файлу синхронизирован общим мьютексом. Тогда каждый будет ждать, когда второй файл закроет. Для этого надо править записывающую программу - а это уже отдельная проблема. _Vasilisk_ Правильно, но не универсально. Исходим из утверждения Андрей Игоревич что запись происходит в файл крайне редко Вызвал бы ReadDirectoryChangesW() с маской, скажем FILE_NOTIFY_CHANGE_LAST_WRITE (или FILE_NOTIFY_CHANGE_LAST_ACCESS - нужно смотреть, что будет адекватнее), дождался бы окончания записи и спокойно прочитал бы файл Не правильно, не универсально, но быстро Дважды прочитал бы файл без монопольного доступа. Если два раза была считана одна и та же информация - файл прочитан корректно Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. В каталоге до полутора тысяч файлов разных видов которые записываются в разное время (хотя между записью/обновлением одного конкретного файла времени проходит много), такой способ интересен, но очень уж сложен :). В общем сделаю через TFileStream.Create с флагом без ограничения доступа и обработаю исключение. Спасибо большое за помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 09:27 |
|
||
|
Корректное чтение файлов, в которые периодически заняты сторонним приложением.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич Ну по такому сценарию файл может быт заблокирован прям в процессе чтения, тогда уж, действительно, ничего кроме исключения не спасет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 10:43 |
|
||
|
Корректное чтение файлов, в которые периодически заняты сторонним приложением.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич Тут ок, сделаю через TFileStream.Create(name, fmOpenRead or fmShareDenyNone ), просто удивлен, зачем его тут для записи открывают, если для записи есть SaveToFile; Его не открывают для записи, а блокируют ОТ записи. Чтобы в процессе чтения кто-то другой не перезаписал содержимое. А вот если открывать с fmShareDenyNone, то такая возможность существует ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 10:58 |
|
||
|
Корректное чтение файлов, в которые периодически заняты сторонним приложением.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич fmShareDenyNone ) Ну и получишь вместо блокировки неконсистентные данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 12:03 |
|
||
|
Корректное чтение файлов, в которые периодически заняты сторонним приложением.
|
|||
|---|---|---|---|
|
#18+
Кстати, если данные только добавляются, то способ имеет право на существование. Более того, у нас крутится построенная на этом система. Накладки бывают, конечно, но в целом схема рабочая ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 13:30 |
|
||
|
Корректное чтение файлов, в которые периодически заняты сторонним приложением.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич fmShareDenyNone ), просто удивлен, зачем его тут для записи открывают Андрей Игоревич тут ок, сделаю через TFileStream.Create(name, fmOpenRead or fmShareDenyNone ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 14:14 |
|
||
|
Корректное чтение файлов, в которые периодически заняты сторонним приложением.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич _Vasilisk_ Вызвал бы ReadDirectoryChangesW() с маской, скажем FILE_NOTIFY_CHANGE_LAST_WRITE (или FILE_NOTIFY_CHANGE_LAST_ACCESS - нужно смотреть, что будет адекватнее), дождался бы окончания записи и спокойно прочитал бы файл Андрей Игоревич но очень уж сложен :). Андрей Игоревич В общем сделаю через TFileStream.Create с флагом без ограничения доступа и обработаю исключение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 16:25 |
|
||
|
Корректное чтение файлов, в которые периодически заняты сторонним приложением.
|
|||
|---|---|---|---|
|
#18+
Василий 2 Андрей Игоревич Тут ок, сделаю через TFileStream.Create(name, fmOpenRead or fmShareDenyNone ), просто удивлен, зачем его тут для записи открывают, если для записи есть SaveToFile; Его не открывают для записи, а блокируют ОТ записи. Чтобы в процессе чтения кто-то другой не перезаписал содержимое. А вот если открывать с fmShareDenyNone, то такая возможность существует Блокировать от записи нельзя ни в коем разе, записывающая программа должна работать и трогать её нельзя (мне). ёёёёё Андрей Игоревич fmShareDenyNone ) Ну и получишь вместо блокировки неконсистентные данные. Жизнь боль, подумаю как обойти, проверки предложенные _Vasilisk_ это хорошо, но у меня только на чтении 2к строчек кода (несколько десятков разновидностей больших файлов), добавлять туда проверки дело долгое, отложу на потом :). white_nigger Андрей Игоревич fmShareDenyNone ), просто удивлен, зачем его тут для записи открывают Андрей Игоревич тут ок, сделаю через TFileStream.Create(name, fmOpenRead or fmShareDenyNone fmOpenRead - Открытие файла только для чтения. fmShareDenyNone — другие приложения могут производить с файлом любые операции. ??? ... white_nigger Может стоит сначала хотя бы почитать описание флагов, прежде чем сморозить хрень? Уверен есть даже в подробностях и на русском языке П.С. Хм, а кнопка "изменить" сообщение всегда снизу была, и я её раньше просто не видел? Да? Хм... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 18:18 |
|
||
|
Корректное чтение файлов, в которые периодически заняты сторонним приложением.
|
|||
|---|---|---|---|
|
#18+
Дубль ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 18:21 |
|
||
|
Корректное чтение файлов, в которые периодически заняты сторонним приложением.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич суть претензии ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 18:34 |
|
||
|
Корректное чтение файлов, в которые периодически заняты сторонним приложением.
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Вот вы и получите событие по каждому изменившемуся файлу, с указанием имени этого файла. Там есть маленькая проблема со временем доставки. Я подписался на переименование файла (поскольку моя программа пишет в .tmp файл и переименовывает его при закрытии), но неожиданно получил shared violation error. То есть чисто подписки на изменение недостаточно для счастья, остальные телодвижения по разведению блокировок тоже придётся выполнить. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 19:31 |
|
||
|
Корректное чтение файлов, в которые периодически заняты сторонним приложением.
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov Я подписался на переименование файла (поскольку моя программа пишет в .tmp файл и переименовывает его при закрытии), но неожиданно получил shared violation error. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. А подписан на события Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 19:51 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39894967&tid=2038821]: |
0ms |
get settings: |
10ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
85ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
| others: | 240ms |
| total: | 435ms |

| 0 / 0 |
