2011-11-21 7 views
-3

J'ai développé une application pour effectuer certaines opérations de fichiers back-end pour mon projet.Comment effectuer des opérations de fichiers plus rapidement sans exceptions?

L'application va écrire un fichier binaire et y effectuer une action, ce qui entraîne la création d'un autre fichier. Ensuite, je vais lire le fichier de sortie pour mettre à jour ma base de données.

Considérons, par exemple, je vais écrire un fichier ABC.bin et le fichier de sortie est XYZ.bin

Toutes les actions mentionnées ci-dessus seront effectués en 10 millisecondes. Et je vais continuer le même processus pour un certain nombre de fois par exemple 100 fois.

Maintenant, le problème est que j'obtiens quelques exceptions comme le fichier non trouvé, accès refusé lors de l'exécution de mon application à partir du code source.

Mais je ne reçois pas les mêmes exceptions après avoir fait l'application en tant que fichier exécutable (.exe).

Que se passe-t-il dans les deux cas? Pourquoi la même chose ne se passe pas après l'avoir fait en tant que fichier exécutable?

+0

Vous ne savez pas exactement ce que vous voulez dire. Mais les exceptions sont * beaucoup * plus rapides si vous n'avez pas de débogueur attaché. – CodesInChaos

+1

Vous ne pouvez pas (en général) exécuter du code C# à partir du code source; il génère toujours un fichier EXE. Votre problème est à la différence de la façon dont vous exécutez ce fichier EXE (à l'intérieur/à l'extérieur de Visual Studio). Probablement en raison du répertoire de travail. –

+0

@Roger Lipscombe: Oui ... je reçois des exceptions lors de l'exécution de l'exe dans le Visual Studio mais cela ne se produit pas en dehors de l'EDI –

Répondre

1

Peu de choses que vous pourriez faire:

  • si vous ne voyez des exceptions alors que sous débogueur et non lorsque vous exécutez exécutable autonome, vérifier les paramètres d'exception dans votre Visual Studio. Aller à Debug -> Exceptions ... et assurez-vous que tout dans Thrown est décochée

  • vérifier si ce serait plus rapide d'interroger si le fichier existe en utilisant la méthode File.Exists avant de commencer à copier (ce qui est de la solution de cours seulement pour FileNotFoundException)

  • encapsuler une boucle de copie dans un bloc try-catch, au lieu d'encapsuler du code qui se trouve dans la boucle. Comme si:

    List<string> fileNames = new List<string>() { "file1.txt", "file2.txt", ... }; 
    int i = 0; 
    try 
    { 
        for (i = 0; i < fileNames.Count; i++) 
         // do copying here 
    } 
    catch (Exception ex) 
    { 
        // log exception 
    } 
    // You can decide if to return to copying rest of the files here, from i+1 
    

Tout cela est fait pour éviter d'entrer et de sortir try bloc pour chaque fichier qui a son coût.

+1

"Ceci est bien sûr la seule solution à FileNotFoundException" et bien sûr, il n'est utile que très tôt, il ne peut pas empêcher complètement l'exception. De plus, je ne suis pas sûr que cela augmente réellement les performances. Je ne serais pas surpris si cela diminue la performance en moyenne puisque maintenant le fichier est ouvert deux fois. – CodesInChaos

+0

Je suis d'accord avec vous que vous ne savez jamais avec la performance, c'est pourquoi j'ai dit qu'il peut enquêter sur cela et n'a fait aucune réclamation. Quoi qu'il en soit, je l'ai essayé moi-même, et plus de 1000 résultats d'itérations sont: File.Exists 0.0036562s, essayez/attraper sur File.Copy 2 individuel.3249567s. En outre, File.Exists ne remédie pas à tout, vous pourriez toujours obtenir des exceptions après, bien sûr, mais comme vous pouvez le voir, il vaut mieux vérifier au préalable et même obtenir des faux positifs plutôt que de lancer des blocs try/catch. –

+0

Avez-vous connecté un débogueur? Les nombres de 'File.Copy' sont environ 10 fois plus élevés que ce à quoi je m'attendais. Et dans de nombreux cas, la plupart des fichiers que vous consultez existent. Edit: Juste testé. 'File.Copy' ne prend qu'environ 200us pour moi, c'est-à-dire environ 10 fois plus vite que ce que vous avez mesuré. – CodesInChaos

Questions connexes