В чем может быть причина ошибки Windows ERROR_DISK_FULL (112) при открытии альтернативного потока данных NTFS?
Вопрос
Мое приложение записывает несколько байтов данных в альтернативный поток данных.Это прекрасно работает на всех компьютерах, кроме одного (Windows Server 2003 SP2).Вместо этого CreateFile возвращает ERROR_DISK_FULL
когда я пытаюсь создать альтернативный поток данных (в корневом каталоге).Я не нахожу причины такого результата, потому что...
На этом диске достаточно места.
Диск отформатирован в NTFS (из-за GetVolumeInformation).
Накопитель поддерживает текущие данные потоки (из-за GetVolumeInformation).
Редактировать:Я могу предоставить еще немного информации о том, в чем причина не является:Я добавил много потоков в тестовую систему, которая не показывала ошибку, и задался вопросом, может ли ошибка возникнуть.Этого не произошло.Вместо этого примерно после 2000 потоков с длинными именами файлов возникла другая ошибка, которая сохранялась:1450 (ОШИБКА_NO_SYSTEM_RESOURCES).
Редактировать:Вот пример одного из используемых имен файлов:
char szStreamFileName[] = "C:\\:abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnoqrstuvwxyz012345";
Редактировать:Наш клиент использует на этом сервере корпоративное антивирусное программное обеспечение Avira.Возможно, причина в этом (вредоносные программы могут злоупотреблять альтернативными потоками данных).
Решение
После открытия обращения в службу поддержки в MS я знаю, что был установлен флаг только для чтения, который можно установить (и сбросить) только с недокументированными функциями Windows.Никто не знает, кто установил этот флаг и почему, но я отправил им изображение накопителя (после того, как получил устройство от нашего клиента), и они с этим разобрались.У нас есть обходной путь только в нашем приложении (мы используем другое местоположение, если обнаруживаем эту ошибку).Между тем мы знаем, что у некоторых наших клиентов есть эта проблема.
Другие советы
Существуют ли какие-либо сжатые / запасные файлы или альтернативные потоки данных?
Часто приложения резервного копирования получают ошибки ERROR_DISK_FULL при попытке создать резервную копию сжатых файлов, и это вызывает некоторую путаницу, когда на диске все еще остается несколько гигабайт свободного места.При копировании сжатых файлов также могут возникать другие проблемы.Цель этого блога - дать читателю более полное представление о том, что на самом деле происходит при сжатии файлов NTFS.
Просто выстрел вслепую, но правильно ли установлены права?
Просто еще одна возможность...
Вы проверили количество открытых в данный момент файлов в вашей операционной системе?Операционная система поддерживает макс.количество зарезервированных дескрипторов файлов после этого отчета ERROR_DISK_FULL или ERROR_NO_SYSTEM_RESOURCES.
И вторая возможность...Корневой каталог ограничен количеством файлов.Насколько я помню, 512 файлов в старых версиях ОС.Но NTFS поддерживает неограниченное количество файлов в root!
Возможно, вы захотите посмотреть, что такое что-то вроде Монитор процесса Sysinternal утилита захватывает данные при попытке создать этот файл - в нем отображаются коды возврата различных API, задействованных в стеке ввода-вывода, и один из них может дать вам ключ к пониманию того, почему вам возвращается 112.Надеюсь, уровень детализации в ProcMon достаточен - если нет, я предполагаю, что есть другие, более подробные средства трассировки ввода-вывода для Windows (но я не знаю о них с самого начала)
Имя файла, которое вы указываете, является
char szStreamFileName[] = "C:\\:abcdefghijklm...
все начинается с
C:\\:
Это опечатка в сообщении, или действительно после косой черты стоит двоеточие?Я думаю, что это незаконное имя файла.
Если вы попытаетесь скопировать файл размером более 2 ГБ из другой файловой системы (NTFS) в FAT / FAT32 с ограничением в 2 ГБ, вы можете увидеть эту ошибку.