2009-10-22 3 views
0

Mon application écrit des octets de données dans un autre flux de données. Cela fonctionne correctement sur toutes les machines sauf une (Windows Server 2003 SP2). CreateFile renvoie à la place ERROR_DISK_FULL lorsque j'essaie de créer un flux de données alternatif (dans le répertoire racine). Je ne trouve pas la raison de ce résultat, parce que ...Quelle peut être la raison de l'erreur Windows ERROR_DISK_FULL (112) lors de l'ouverture d'un flux de données alternatif NTFS?

  • Il y a beaucoup d'espace sur ce disque.

  • Le lecteur est au format NTFS (en raison de GetVolumeInformation).

  • Le lecteur prend en charge l'altenation des données flux (en raison de GetVolumeInformation).

Edit: Je peux fournir un peu plus d'informations sur la raison pas est: J'ai ajouté de nombreux cours d'eau sur un système de test qui ne montre l'erreur et se demande si l'erreur peut se produire. Ce n'est pas le cas. Au lieu de 2000 flux avec des noms de fichiers longs, une autre erreur s'est produite et a persisté: 1450 (ERROR_NO_SYSTEM_RESOURCES).

EDIT: Voici un exemple pour l'un des noms de fichier utilisés:

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

EDIT: Notre client utilise un logiciel antivirus d'entreprise de Avira sur ce serveur. Peut-être que c'est la raison (d'autres flux de données peuvent être abusés par des logiciels malveillants).

+0

Pourriez-vous donner un exemple concret pour le paramètre 'lpFileName' de la fonction' CreateFile'? – Michael

Répondre

2

Après l'ouverture d'un ticket de support à MS, je sais qu'il y avait un ensemble d'indicateurs en lecture seule que l'on peut seulement définir (et réinitialiser) avec des fonctions Windows non documentées. Personne ne sait qui a mis ce drapeau et pourquoi, mais je leur ai envoyé une image du disque (après que j'ai eu la machine de notre client) et ainsi ils l'ont compris. Nous avons seulement une solution de contournement dans notre application (nous utilisons un autre emplacement si nous détectons cette erreur). En attendant, nous savons que certains de nos clients ont ce problème.

+0

Et quelle est cette API non documentée? – philk

+0

@philk: Ils ne nous l'ont pas dit. J'ai fait des recherches et trouvé une fonction nommée "SetBasicInformationFile". –

0

Juste un tir aveugle, mais les droits sont-ils réglés correctement?

+0

Oui, cela ne ressemble pas à des privilèges manquants. L'utilisateur exécutant les applications a des droits d'administrateur. En outre, j'ai essayé de provoquer des erreurs en raison de droits insuffisants et ai obtenu l'erreur 5 comme prévu. –

0

Juste une autre possibilité ...

Avez-vous vérifié le nombre de fichiers actuellement Opend dans votre système d'exploitation? Le support OS max. nombre de handles de fichiers réservés après ce rapport ERROR_DISK_FULL ou ERROR_NO_SYSTEM_RESOURCES.

Et deuxième possibilité ... Le répertoire racine est limité par le nombre de fichiers. Comme je me souviens de 512 fichiers dans les anciennes versions de OS. Mais le NTFS supporte un nombre illimité de fichiers dans root!

+0

Merci pour vos conseils. Je suppose que le second ne peut pas être la raison, mais pour le premier je vais laisser le client réessayer après un redémarrage du système (je pense qu'il a fait de toute façon). Mon application n'ouvre pas beaucoup de fichiers, mais je lui demande de vérifier les fichiers ouverts dans leur ensemble avec openfiles.exe. –

+0

Peut-être a une application ou un processus une fin de bug ne relache pas les poignées alocated. Vous pouvez vérifier le nombre de handles alocated par procces dans 'Gestionnaire des tâches de Windows' dans la fenêtre de processus, les poignées ne sont pas visibles par défaut, vous devez activer 'View/Select Columns/Handle Count'. Toutes les poignées de ressources sont importantes et pas seulement les poignées de fichiers qu'elles utilisent la même memmory. –

1

Existe-t-il des fichiers compressés/de rechange ou des flux de données alternatifs?

Souvent, les applications de sauvegarde reçoivent des erreurs ERROR_DISK_FULL qui tentent de sauvegarder les fichiers compressés, ce qui cause beaucoup de confusion lorsqu'il reste plusieurs gigaoctets d'espace libre sur le disque. D'autres problèmes peuvent également se produire lors de la copie de fichiers compressés. Le but de ce blog est de donner au lecteur une compréhension plus approfondie de ce qui se passe réellement lorsque vous compressez des fichiers NTFS.

De Understanding NTFS Compression

+0

OK, cela ne semble pas correspondre à votre problème. – Michael

+0

Merci pour cette indication, je vais vérifier cela. Je n'utilise pas de fichiers fragmentés dans mon application, mais peut-être que le disque/dossier est compressé. –

+0

Le client a répondu: Le lecteur/dossier n'est pas compressé. –

0

Vous pouvez voir ce que quelque chose comme Sysinternal's Process Monitor utilitaire captures lorsque vous essayez de créer ce fichier - il montre les codes de retour des différentes API impliquées dans la pile d'E/S et l'un des ils pourraient vous donner une idée de la raison pour laquelle le 112 vous est retourné.Espérons que le niveau de détail dans ProcMon est suffisant - sinon, j'imagine qu'il existe d'autres fonctionnalités de traçage d'E/S plus détaillées pour Windows (mais je ne les connais pas du haut de la tête)

+0

Je voudrais essayer cela mais la machine est chez un de nos clients et je n'ai aucun accès direct à celui-ci. Je ne peux pas reproduire le comportement ici sur une de nos machines. –

0

vous donnez est

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

il commence par

C:\\: 

est-ce une faute de frappe sur le poteau, ou est-il vraiment deux points après la barre oblique? Je pense que c'est un nom de fichier illégal.

+0

Non, pas de faute de frappe - ceci est parfaitement légal pour les flux de données alternatifs. –

0

Si vous essayez de copier un fichier supérieur à 2 Go à partir d'un autre système de fichiers (NTFS) vers FAT/FAT32 qui a une limite de 2 Go, vous pouvez voir cette erreur.

+0

Il n'y a pas de FAT/FAT32 dans le jeu. L'erreur se produit simplement lorsque j'exécute CreateFile pour le flux de données alternatif sur le lecteur NTFS. –

Questions connexes