2009-10-22 4 views
0

Мое приложение записывает несколько байтов данных в альтернативный поток данных. Это отлично работает на всех компьютерах (Windows Server 2003 SP2). Вместо этого CreateFile возвращает ERROR_DISK_FULL при попытке создать альтернативный поток данных (в корневом каталоге). Я не нашел причины для этого результата, потому что ...Что может быть причиной ошибки Windows ERROR_DISK_FULL (112) при открытии альтернативного потока данных NTFS?

  • На этом диске достаточно места.

  • Привод NTFS отформатирован (из-за GetVolumeInformation).

  • Привод поддерживает данные с изображениями (из-за GetVolumeInformation).

Edit: Я могу предоставить более подробную информацию о том, что причина не является: я добавил много потоков на тестовой системе, которая не показывала ошибку, и задавался вопросом, если может произойти ошибка. Это не так. Вместо этого после 2000 потоков с длинными именами файлов произошла и сохранилась еще одна ошибка: 1450 (ERROR_NO_SYSTEM_RESOURCES).

EDIT: Вот пример одного из используемых имен файлов:

char szStreamFileName[] = "C:\\:abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnoqrstuvwxyz"; 

EDIT: Наш клиент использует некоторое корпоративное антивирусное программное обеспечение от компании Avira на этом сервере. Возможно, именно по этой причине (альтернативные потоки данных могут быть использованы вредоносными программами).

+0

Не могли бы вы привести конкретный пример параметра 'lpFileName' функции' CreateFile'? – Michael

ответ

2

После того, как вы открыли билет поддержки в MS, я знаю, что был установлен флаг только для чтения, который можно установить (и сбросить) только с недокументированными функциями Windows. Никто не знает, кто установил этот флаг и почему, но я отправил им образ диска (после того, как я получил машину от нашего клиента), и поэтому они поняли это. У нас есть только обходное решение в нашем приложении (мы используем другое местоположение, если обнаружим эту ошибку). Между тем мы знаем, что некоторые из наших клиентов имеют эту проблему.

+0

И что это недокументированный API? – philk

+0

@philk: Они нам не сказали. Я провел некоторое исследование и нашел функцию под названием «SetBasicInformationFile». –

0

Просто слепой выстрел, но правильно ли установлены права?

+0

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

0

Просто другая возможности ...

Вы проверили количество в данный момент файлов открытой компании вашей ОС? Поддержка ОС макс. количество зарезервированных файлов после этого отчета ERROR_DISK_FULL или ERROR_NO_SYSTEM_RESOURCES.

И вторая возможность ... Корневой каталог ограничен количеством файлов. Как я помню 512 файлов в более старых версиях ОС. Но NTFS поддерживает неограниченное количество файлов в корне!

+0

Благодарим вас за подсказки. Я думаю, что вторая причина не может быть причиной, но для первого я позволю клиенту повторить попытку после перезагрузки системы (я думаю, он все равно). Мое приложение не открывает много файлов, но я попрошу его проверить общие открытые файлы с помощью openfiles.exe. –

+0

Возможно, имеет какое-то приложение или процесс, конец ошибки не связывает выделенные ручки. Вы можете проверить количество выделенных ручек на каждый процесс в «Диспетчере задач Windows» в окне процесса, ручки не отображаются по умолчанию, вы должны включить «Просмотр/Выбор столбцов/Количество ручек». Все ручки ресурсов важны, а не только дескрипторы файлов, которые они используют одну и ту же memmory. –

1

Есть ли сжатые/резервные файлы или альтернативные потоки данных?

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

От Understanding NTFS Compression

+0

ОК, это не похоже на вашу проблему. – Michael

+0

Спасибо за этот намек, я проверю это. Я не использую разреженные файлы в своем приложении, но, возможно, диск/папка сжимается. –

+0

Клиент ответил: Дисковод/папка не сжимается. –

0

Вы можете увидеть, что-то вроде Sysinternal's Process Monitor утилита перехватывает при попытке создать этот файл - это показать коды возврата различных API, участвующих в стек ввода/вывода и один из они могут дать вам понять, почему 112 возвращается вам.Надеюсь, что уровень детализации в ProcMon достаточно - если нет, я полагаю, что для Windows существуют другие, более подробные средства для ввода/вывода для Windows (но я не знаю их с головы)

+0

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

0

Имя файла вы даете это

char szStreamFileName[] = "C:\\:abcdefghijklm... 

начинается с

C:\\: 

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

+0

Нет, никаких опечаток - это совершенно законно для альтернативных потоков данных. –

0

Если вы попытаетесь скопировать файл размером более 2 ГБ из другой файловой системы (NTFS) в FAT/FAT32, который имеет ограничение 2 ГБ, вы можете увидеть эту ошибку.

+0

В игре нет FAT/FAT32. Ошибка возникает просто при выполнении CreateFile для альтернативного потока данных на диске NTFS. –