fclose — Закрывает дескриптор файла


FileStream.Close() не закрывает дескриптор файла мгновенно — c#

Я читаю исходный файл в кусках и передаю его в службу WCf для записи на удаленный SMB. Я сохраняю FileStream до тех пор, пока не будут записаны все данные.

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

Когда все данные записаны, я вызываю CloseHandle(). Тогда мне может потребоваться выполнить другую операцию в том же файле, вызвав DoSomeOperation(). Поскольку я закрыл дескриптор файла в функции CloseHandle(), но я получаю сообщение об ошибке «файл используется с каким-то другим процессом» в DoSomeOperation(). Если я вызову DoSomeOperation() после некоторой задержки, тогда проблема не будет.

Помогите нам мгновенно закрыть дескриптор файла, когда я вызываю FileStream.Close().

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

Я написал небольшой тестовый код для воспроизведения того же сценария в консольном приложении: Just Call TestHandleClose() из Main(), он выдаст ошибку после некоторых циклов.

    1 2
  • 9 авг 2020 2020-08-09 08:16:52
  • Romil Kumar Jain

2 ответа

В моем случае отсутствовал режим FileShare. Я использовал для чтения/записи из нескольких источников в одном файле за короткий промежуток времени. Иногда он прошел хорошо, а иногда и блокировался (другой процесс держал файл), даже несмотря на то, что filestream был выпущен, и я использовал блокировку и использование(). Все было решено, когда я добавил режим ReadSrite в FileShare.

  • 9 авг 2020 2020-08-09 08:16:53
  • Simon

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

Дело в том, что даже последний образец кода не воспроизводится. Однако это показывает еще одну вещь, которую вы, возможно, пропустили — файл, который вы пишете, является .exe . Почему это проблема? Ну, есть несколько причин, но один из них заключается в том, что когда вы указываете каталог, в котором файл .exe использует проводник, исследователь идет вперед и пытается его прочитать (чтобы получить значок). За это короткое время файл не может быть открыт с помощью FileShare.None (и на самом деле FileShare.Read вероятно, тоже не поможет, так как вполне вероятно, кто бы ни открывал его, не указывал FileShare.ReadWrite ).

Итак, опять же, FileStream закрыт просто отлично и работает хорошо (избавиться от вызовов Flush и Close , хотя — они теряют производительность и бесполезны). Проблема в том, что другой процесс пытается прочитать файл тем временем. Это может быть какой-то файловый менеджер, как в моем случае (Explorer, Total Commander. ), может быть, у вас есть какой-то FileSystemWatcher , это может быть сканер вирусов (хотя большинство антивирусных сканеров в настоящее время используют теневые копии), это может быть то, что автоматически создает эскизы для изображений и т.д. Но код, который вы разместили сами, просто не вызывает проблемы — это кто-то еще захватывает ваш файл.

В основном у вас есть два варианта: либо держать файл открытым все время, в котором он вам нужен, либо обрабатывать IOException как временное, и повторять несколько раз за определенный интервал. То, что вы должны делать в любом случае, вместо того, чтобы полагаться на счастливый путь — большинство читателей допускают одновременное чтение, а не запись.

FileStream.Close () не закрывает дескриптор файла мгновенно

Я читаю исходный файл кусками и передаю его службе WCf для записи на некоторый удаленный SMB. Я держу открытым FileStream, пока все данные не будут записаны.

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


Как только все данные записаны, я вызываю CloseHandle (). Тогда мне может потребоваться выполнить какую-то другую операцию над тем же файлом, вызвав DoSomeOperation (). Поскольку я закрыл дескриптор файла в функции CloseHandle (), но я получаю сообщение об ошибке «файл используется с другим процессом» в DoSomeOperation (). Если я вызываю DoSomeOperation () после некоторой задержки, проблема не возникает.

Пожалуйста, помогите нам немедленно закрыть дескриптор файла, когда я вызываю FileStream.Close ().

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

Я написал небольшой тестовый код для воспроизведения того же сценария в консольном приложении: просто вызовите TestHandleClose () из Main (), после нескольких циклов он выдаст ошибку.

Окончательный пример кода помог, я почти уверен, что у вас есть проблема.

Дело в том, что даже последний пример кода не воспроизводится. Однако, это показывает еще одну вещь, которую вы, вероятно, пропустили — файл, который вы пишете, — .exe . Почему это проблема? Ну, есть несколько причин, но одна из них заключается в том, что когда вы указываете каталог, в котором файл .exe использует проводник, проводник пытается его прочитать (чтобы получить значок). За это короткое время файл не может быть открыт с помощью FileShare.None (и фактически FileShare.Read вероятно, тоже не поможет, так как вполне вероятно, кто бы его ни открыл, он не указал FileShare.ReadWrite ).

Илон Маск рекомендует:  Что такое код asp mimemap

Итак, еще раз, FileStream закрывается просто отлично и работает хорошо (хотя избавьтесь от вызовов Flush и Close — они теряют производительность и бесполезны). Проблема в том, что другой процесс пытается прочитать файл в это время. Это может быть какой-то файловый менеджер, как в моем случае (Explorer, Total Commander, . ), это может быть какой-то FileSystemWatcher который у вас есть, это может быть антивирусный сканер (хотя большинство антивирусных сканеров в настоящее время используют теневые копии), это может быть что-то, что автоматически создает миниатюры для изображений и т. д. Но сам код, который вы разместили, просто не вызывает проблемы — это кто-то другой захватывает ваш файл.

По сути, у вас есть две опции: либо оставляйте файл открытым все время, когда вам это нужно, либо обрабатывайте IOException как временное и повторите попытку несколько раз в течение определенного интервала. Это то, что вы должны делать в любом случае, вместо того, чтобы полагаться на путь счастья — большинство читателей разрешают только параллельное чтение, а не запись.

fclose

fclose — Закрывает дескриптор файла

Описание

Функция закрывает файл, на который указывает handle.

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Дескриптор должен указывать на файл, открытый ранее с помощью функции fopen() или fsockopen() .

Пример #1 Простой пример использования функции fclose()

= fopen ( ‘somefile.txt’ , ‘r’ );

НОВОСТИ ФОРУМА
Рыцари теории эфира
01.10.2020 — 05:20: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Youtube]69vJGqDENq4[/Youtube][/center]
[center]14:36[/center]
Osievskii Global News
29 сент. Отправлено 05:20, 01.10.2020 г.’ target=_top>Просвещение от Вячеслава Осиевского — Карим_Хайдаров.
30.09.2020 — 12:51: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Ok]376309070[/Ok][/center]
[center]11:03[/center] Отправлено 12:51, 30.09.2020 г.’ target=_top>Просвещение от Дэйвида Дюка — Карим_Хайдаров.
30.09.2020 — 11:53: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Youtube]VVQv1EzDTtY[/Youtube][/center]
[center]10:43[/center]

интервью Раввина Борода https://cursorinfo.co.il/all-news/rav.
мой телеграмм https://t.me/peshekhonovandrei
мой твиттер https://twitter.com/Andrey54708595
мой инстаграм https://www.instagram.com/andreipeshekhonow/

[b]Мой комментарий:
Андрей спрашивает: Краснодарская синагога — это что, военный объект?
— Да, военный, потому что имеет разрешение от Росатома на манипуляции с радиоактивными веществами, а также иными веществами, опасными в отношении массового поражения. Именно это было выявлено группой краснодарцев во главе с Мариной Мелиховой.

[center][Youtube]CLegyQkMkyw[/Youtube][/center]
[center]10:22 [/center]

Доминико Риккарди: Россию ждёт страшное будущее (хотелки ЦРУ):
https://tainy.net/22686-predskazaniya-dominika-rikardi-o-budushhem-rossii-sdelannye-v-2000-godu.html

Завещание Алена Даллеса / Разработка ЦРУ (запрещено к ознакомлению Роскомнадзором = Жид-над-рус-надзором)
http://av-inf.blogspot.com/2013/12/dalles.html

[center][b]Сон разума народа России [/center]

[center][Youtube]CLegyQkMkyw[/Youtube][/center]
[center]10:22 [/center]

Доминико Риккарди: Россию ждёт страшное будущее (хотелки ЦРУ):
https://tainy.net/22686-predskazaniya-dominika-rikardi-o-budushhem-rossii-sdelannye-v-2000-godu.html


Завещание Алена Даллеса / Разработка ЦРУ (запрещено к ознакомлению Роскомнадзором = Жид-над-рус-надзором)
http://av-inf.blogspot.com/2013/12/dalles.html

[center][b]Сон разума народа России [/center]

Непонятная ошибка при закрытии дескриптора файла

1) Непонятная проблема происходит при закрытии дескриптора файла (открытого файла на чтение) в коде на C++ ниже (ОС Linux). Это метод класса, который вызывается периодически по таймеру. Если я вставляю в конце этой функции close(barcode_fd), то программа падает в segmentation fault, а если оставляю без оператора close, то программа работает правильно, но в системе со временем исчерпываются все дескрипторы файлов, что очевидно, т. к. они не закрываются в программе.

Буду благодарен, если кто подскажет почему close() не хочет закрывать дескриптор и как это сделать правильно?

(Наличие или отсутствие флага O_NONBLOCK никак не влияет на решение проблемы, т. е. все точно также как я описал, то же самое с любым текстовым файлом, не обязательно /dev/ttyACM0.)

2) Я понимаю, что это скорее сишный код в методе, но я не знаю как с помощью файловых потоков С++ задать неблокируемый режим для файла на чтение (т. е. флаг O_NONBLOCK). Буду благодарен за подсказку как это сделать при помощи файловых потоков С++.

28.09.2014, 13:52

Ошибка при закрытии неблокирующего сокета со стороны клиента
Здравствуйте, уважаемые. Столкнулся с такой вот проблемой. Сделал набросок сервера на.

Ошибка при закрытии текстового файла
Доброго времени суток товарищи форумчане, объясните пожалуйста в чем ошибка: procedure.

Ошибка при закрытии OpenDialog без выбора файла и при нажатии кнопки Отмена
почему при закрытии OpenDialog (если не че не открыл), или при нажатии кнопку отмена вылазеет.

Ошибка при создании дескриптора окна
Столкнулся с сообщением «Ошибка при создании дескриптора окна» в самом тривиальном случае — при.

Ошибка при создании дескриптора окна
Создал программу, без проблем компилируется и запускается на Win10, но при попытке перенести на.

_close _close

Закрывает файл. Closes a file.

Синтаксис Syntax

Параметры Parameters

fd fd
Дескриптор файла, ссылающийся на открытый файл. File descriptor referring to the open file.

Возвращаемое значение Return Value

_close возвращает 0, если файл был успешно закрыт. _close returns 0 if the file was successfully closed. Возвращаемое значение, равное-1, указывает на ошибку. A return value of -1 indicates an error.

Примечания Remarks

Функция _close закрывает файл, связанный с демоном. The _close function closes the file associated with fd.

Дескриптор файла и соответствующий обработчик файлов операционной системы закрываются. The file descriptor and the underlying OS file handle are closed. Поэтому нет необходимости вызывать функцию CloseHandle , если файл был первоначально открыт с помощью функции Win32 CreateFile и преобразован в дескриптор файла с помощью _open_osfhandle. Thus, it is not necessary to call CloseHandle if the file was originally opened using the Win32 function CreateFile and converted to a file descriptor using _open_osfhandle.

Эта функция проверяет свои параметры. This function validates its parameters. Если демон демона является неверным дескриптором файла, вызывается обработчик недопустимых параметров, как описано в разделе Проверка параметров. If fd is a bad file descriptor, the invalid parameter handler is invoked, as described in Parameter Validation. Если выполнение может быть продолжено, функции возвращают значение-1 , а для возврата — значение EBADF. If execution is allowed to continue, the functions returns -1 and errno is set to EBADF.

Требования Requirements


Подпрограмма Routine Обязательный заголовок Required header Необязательный заголовок Optional header
_close _close

Дополнительные сведения о совместимости см. в разделе Совместимость. For more compatibility information, see Compatibility.

Пример Example

См. пример для _open. See the example for _open.

FileStream.Close () не закрывает дескриптор файла мгновенно

Я читаю исходный файл кусками и передаю его службе WCf для записи на некоторый удаленный SMB. Я держу открытым FileStream, пока все данные не будут записаны.

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

Как только все данные записаны, я вызываю CloseHandle (). Тогда мне может потребоваться выполнить какую-то другую операцию над тем же файлом, вызвав DoSomeOperation (). Поскольку я закрыл дескриптор файла в функции CloseHandle (), но я получаю сообщение об ошибке «файл используется с другим процессом» в DoSomeOperation (). Если я вызываю DoSomeOperation () после некоторой задержки, проблема не возникает.

Пожалуйста, помогите нам немедленно закрыть дескриптор файла, когда я вызываю FileStream.Close ().

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

Я написал небольшой тестовый код для воспроизведения того же сценария в консольном приложении: просто вызовите TestHandleClose () из Main (), после нескольких циклов он выдаст ошибку.

2 ответа

Окончательный пример кода помог, я почти уверен, что у вас есть проблема.

Дело в том, что даже последний пример кода не воспроизводится. Однако, это показывает еще одну вещь, которую вы, вероятно, пропустили — файл, который вы пишете, — .exe . Почему это проблема? Ну, есть несколько причин, но одна из них заключается в том, что когда вы указываете каталог, в котором файл .exe использует проводник, проводник пытается его прочитать (чтобы получить значок). За это короткое время файл не может быть открыт с помощью FileShare.None (и фактически FileShare.Read вероятно, тоже не поможет, так как вполне вероятно, кто бы его ни открыл, он не указал FileShare.ReadWrite ).

Итак, еще раз, FileStream закрывается просто отлично и работает хорошо (хотя избавьтесь от вызовов Flush и Close — они теряют производительность и бесполезны). Проблема в том, что другой процесс пытается прочитать файл в это время. Это может быть какой-то файловый менеджер, как в моем случае (Explorer, Total Commander, . ), это может быть какой-то FileSystemWatcher который у вас есть, это может быть антивирусный сканер (хотя большинство антивирусных сканеров в настоящее время используют теневые копии), это может быть что-то, что автоматически создает миниатюры для изображений и т. д. Но сам код, который вы разместили, просто не вызывает проблемы — это кто-то другой захватывает ваш файл.

По сути, у вас есть две опции: либо оставляйте файл открытым все время, когда вам это нужно, либо обрабатывайте IOException как временное и повторите попытку несколько раз в течение определенного интервала. Это то, что вы должны делать в любом случае, вместо того, чтобы полагаться на путь счастья — большинство читателей разрешают только параллельное чтение, а не запись.

Перезаписать дескриптор файла без использования fclose() в результате недостатка?

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

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

Когда память для начального дескриптора отпущена, ваша система может очистить указатель и закрыть его. Со следующим скриптом:

Я получаю следующий вывод из inotifywait -m -r. :

Это означает, что без явного fclose на example.txt он все равно неявно закрывается Zend Engine так же, как закрывает открытый дескриптор в конце выполнения скрипта (т. Е. Путем подсчета ссылок).

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

Ручки файлов будут открыты до тех пор, пока вы не fclose()

Все, что вы делаете, это переписать переменную, потеряв любую ссылку на предыдущий дескриптор. Если вам все еще нужно их контролировать, назначьте их различным переменным.


И сборщики мусора обычно должны удалять объекты без ссылки из памяти, но это не всегда.

Переписать дескриптор файла без использования fclose(), в результате недостаток?

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

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

2 ответа

Возможно, для Вашего проекта будут необходимы бесплатные векторные карты. На нашем сайте представлены карты для всех стран.

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

Я получаю следующий вывод inotifywait -m -r . :

Это означает, что без явного fclose на example.txt , Он неявный закрыт в любом случае с помощью Zend Engine, таким же образом, как это было бы закрыть открытую ручку в конце выполнения сценария (т.е. по подсчета ссылок).

Тем не менее, я бы рекомендовал вам правильно и явно закрыть все файловые дескрипторы, особенно учитывая ваш случай использования — последствия памяти на открытие нескольких файлов дескрипторов в цикле должно быть достаточно беспокойства здесь. Добавьте к этому каким-либо проблемам с длинным запуском сценариев потенциально захвата блокировок файлов, соображения безопасности, то лучше чистить ручку правильно.

Файловые ручки будут еще открыты, пока вы не вызовете fclose()

Все, что вам сделать, это переписать переменную, теряя ссылку на предыдущую ручку. Если вам все еще нужно, чтобы контролировать их, распределить их по разным переменным.

И сборщики мусора, как правило, необходимо удалить объекты без ссылки из памяти, но этого не происходит всегда.

Fclose — Закрывает дескриптор файла

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

Параметры:
nFileHandle
Задает дескриптор файла низкого уровня, который нужно закрыть. Дескриптор файла возвращается, когда вы создаете файл с помощью функции FCREATE( ) или открываете его с помощью функции FOPEN( ).
Если вы открыли порт связи с помощью файловой функции низкого уровня, его можно закрыть, указав назначенный ему дескриптор файла.
В Visual FoxPro, FoxPro для Windows и FoxPro для Macintosh нельзя открывать порты с помощью файловых функций низкого уровня.

Комментарии:
Если файл успешно закрыт, функция FCLOSE( ) возвращает значение «истина» (.T.) и освобождает дескриптор файла. Если файл закрыть не удалось, FCLOSE( ) возвращает «ложь» (.F.).
Файлы низкого уровня закрываются и по команде CLOSE ALL.

FileStream.Close() не закрывает дескриптор файла мгновенно — c#

Я читаю исходный файл в кусках и передаю его в службу WCf для записи на удаленный SMB. Я сохраняю FileStream до тех пор, пока не будут записаны все данные.

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

Когда все данные записаны, я вызываю CloseHandle(). Тогда мне может потребоваться выполнить другую операцию в том же файле, вызвав DoSomeOperation(). Поскольку я закрыл дескриптор файла в функции CloseHandle(), но я получаю сообщение об ошибке «файл используется с каким-то другим процессом» в DoSomeOperation(). Если я вызову DoSomeOperation() после некоторой задержки, тогда проблема не будет.

Помогите нам мгновенно закрыть дескриптор файла, когда я вызываю FileStream.Close().

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

Я написал небольшой тестовый код для воспроизведения того же сценария в консольном приложении: Just Call TestHandleClose() из Main(), он выдаст ошибку после некоторых циклов.

    2 2
  • 9 авг 2020 2020-08-09 08:16:52
  • Romil Kumar Jain

2 ответа

В моем случае отсутствовал режим FileShare. Я использовал для чтения/записи из нескольких источников в одном файле за короткий промежуток времени. Иногда он прошел хорошо, а иногда и блокировался (другой процесс держал файл), даже несмотря на то, что filestream был выпущен, и я использовал блокировку и использование(). Все было решено, когда я добавил режим ReadSrite в FileShare.

  • 9 авг 2020 2020-08-09 08:16:53
  • Simon

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

Дело в том, что даже последний образец кода не воспроизводится. Однако это показывает еще одну вещь, которую вы, возможно, пропустили — файл, который вы пишете, является .exe . Почему это проблема? Ну, есть несколько причин, но один из них заключается в том, что когда вы указываете каталог, в котором файл .exe использует проводник, исследователь идет вперед и пытается его прочитать (чтобы получить значок). За это короткое время файл не может быть открыт с помощью FileShare.None (и на самом деле FileShare.Read вероятно, тоже не поможет, так как вполне вероятно, кто бы ни открывал его, не указывал FileShare.ReadWrite ).

Итак, опять же, FileStream закрыт просто отлично и работает хорошо (избавиться от вызовов Flush и Close , хотя — они теряют производительность и бесполезны). Проблема в том, что другой процесс пытается прочитать файл тем временем. Это может быть какой-то файловый менеджер, как в моем случае (Explorer, Total Commander. ), может быть, у вас есть какой-то FileSystemWatcher , это может быть сканер вирусов (хотя большинство антивирусных сканеров в настоящее время используют теневые копии), это может быть то, что автоматически создает эскизы для изображений и т.д. Но код, который вы разместили сами, просто не вызывает проблемы — это кто-то еще захватывает ваш файл.

В основном у вас есть два варианта: либо держать файл открытым все время, в котором он вам нужен, либо обрабатывать IOException как временное, и повторять несколько раз за определенный интервал. То, что вы должны делать в любом случае, вместо того, чтобы полагаться на счастливый путь — большинство читателей допускают одновременное чтение, а не запись.

Илон Маск рекомендует:  Что такое код ingres_rollback
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL