2009-09-22 4 views
3

Je recherche récursivement dans les répertoires, et je dois juste m'assurer que si un fichier est ouvert ou en cours d'écriture, il ne sera pas retourné dans la liste des fichiers.Est-ce que DirectoryInfo.GetFiles() renvoie les fichiers en cours d'écriture dans/open?

(Ceci est pour un composant FTP, je ne veux pas envoyer un fichier s'il est ouvert pour l'écriture déjà)

Merci, Kevin

+1

Une fois que vous aurez récupéré votre liste, le statut de ces fichiers pourrait facilement changer. Votre design, il y a quelque chose qui ne va pas. – Will

+0

Dans ce cas, le fichier ne changera pas. C'est un fichier EDI en cours d'écriture. Ils ne seront jamais modifiés, seulement créés puis laissés seuls. – Kevin

Répondre

4

Oui, il retournera les fichiers qui sont encore en utilisation. Ils sont toujours dans le répertoire, même si vous ne pouvez pas les ouvrir actuellement.

Code d'essai pour le prouver:

using System; 
using System.IO; 
using System.Linq; 

class Test 
{ 
    static void Main() 
    { 
     File.Delete("test.tmp"); 
     // Prints false - the delete worked 
     Console.WriteLine(Directory.GetFiles(".") 
            .Any(x => x.EndsWith("\\test.tmp"))); 
     using (Stream stream = File.Create("test.tmp")) 
     { 
      // Prints true, even though the stream is still open 
      Console.WriteLine(Directory.GetFiles(".") 
             .Any(x => x.EndsWith("\\test.tmp"))); 
     }  
    } 
} 

Comme on dit, même si vous pouvez cela, il n'y a aucune garantie que vous seriez encore en mesure d'ouvrir le fichier une seconde plus tard. Les vérifications du système de fichiers ne seront jamais que des instantanés, à moins que vous ne fassiez quelque chose pour assurer vous-même la cohérence, comme ouvrir le fichier et le maintenir ouvert.

+2

La solution de contournement traditionnelle consiste à télécharger le fichier dans un répertoire et à le déplacer dans un autre dès qu'il est entièrement arrivé. Des schémas similaires impliquent un changement de nom au lieu d'un déplacement, mais c'est essentiellement la même chose au niveau du fichier. –

1

Oui. La seule façon que je sais pour voir si un fichier est verrouillé pour essayer de le lire.

0

Vous pouvez baser une règle sur LastAccessTime de chaque fichier?

+0

Intelligent, mais probablement pas en sécurité. Le fichier pourrait être maintenu ouvert sans avoir été récemment consulté. –

0

Vous devez d'abord obtenir la liste, qui renverra tous les fichiers présents dans le répertoire (ouverts ou non), puis, avant d'envoyer les fichiers, ouvrir chaque échec de capture de fichier.

Si l'ouverture n'échoue pas, vous pouvez les envoyer en toute sécurité (personne n'écrira ou ne l'ouvrira). Si cela échoue, vous savez que vous ne pouvez pas ouvrir le fichier et l'ignorer.

Même s'il était possible de vérifier l'appel GetFiles(), vous ne pouvez pas savoir que le statut est toujours le même que lorsque vous avez vérifié la première fois.

Questions connexes