2009-06-14 16 views
2

J'ai un petit problème avec la méthode File.Copy dans WPF, mon code est très simple et je reçois une exception quand je le lance,File.Copy et WPF

Could not find a part of the path 'Images\37c31987-52ee-4804-8601-a7b9b4d439fd.png'. 

Images est un dossier relatif.

Voici mon code, comme je l'ai dit simple et le même code fonctionne très bien dans une application console, pas de problème du tout.

string filenamae = System.IO.Path.Combine(images, Guid.NewGuid().ToString() + System.IO.Path.GetExtension(imageFile)); ; 
System.IO.File.Copy(imageFile, filenamae); 
this.ImageLocation = string.Empty; 

Donc, si tout peut aider, merci.

Répondre

2

Le dossier images existe-t-il? File.Copy ne le crée pas automatiquement.

Savez-vous quel est votre répertoire actuel? Fichier ouvrir/enregistrer des boîtes peuvent changer cela. Il est donc toujours plus sûr de travailler avec des chemins absolus.

Faites un

Path.GetFullPath(filename) 

et voir où cela pointe. Est-ce le bon endroit?

+0

le dossier existe. – abdelkarim

+0

et même avec votre méthode, l'exception est toujours là. – abdelkarim

2

Si vous utilisez l'absolu au lieu du chemin relatif, cela fonctionne-t-il alors?

+0

le dossier est dans le même répertoire de l'application, pourquoi doit être absolue, et d'ailleurs pourquoi cela fonctionne bien dans une application console. c'est ce qui m'a arrêté. Pourquoi? Quelle est la différence entre une application WPF et une console App – abdelkarim

+0

"pourquoi faut-il être absolu" - Parce que votre répertoire actuel ne sera pas toujours le même que votre répertoire EXE? L'invite de commande vous permet de démarrer un EXE à partir d'un répertoire autre que le répertoire actuel. Les raccourcis vous permettent de spécifier le répertoire de démarrage. Dans les deux cas, voulez-vous vraiment que votre application plante? Les chemins relatifs sont presque toujours une mauvaise idée. –

+0

"pourquoi faut-il être absolu" - peut-être que vous devriez l'essayer et voir si cela fonctionne, puis s'inquiéter de la nécessité d'être absolu. – Josh

0

Avez-vous un débogueur? Pourquoi ne pas insérer un point d'arrêt et vérifier les valeurs utilisées à chaque étape?

Si le système de fichiers dit « ne peut pas trouver le fichier », je ne viendrais pas discuter avec elle ...

+0

les deux valeurs sont correctes. en fait, dans une application de console, cela fonctionne bien. – abdelkarim

+0

Quand vous dites application console, voulez-vous dire 'pas une application winforms' ou voulez-vous dire 'en mode debug'? Quoi qu'il en soit, essayez d'écrire les valeurs dans le journal des événements dans le cas où votre code ne fonctionne PAS ... – Benjol

1

Avant d'accéder à un fichier, vous devez appeler System.IO.File.Exists(). Il n'est pas clair à partir de votre description d'erreur si le fichier d'origine existe ou pas avant la copie.

Si vous ne spécifiez pas de chemin absolu, votre chemin relatif est souvent résolu à partir d'endroits inattendus, généralement le répertoire de travail actuel du processus. L'appel de cette méthode peut vous dire étiez le processus en cours d'exécution:

System.IO.Directory.GetCurrentDirectory()

Vous ne devriez jamais faire des hypothèses sur le répertoire de travail en cours d'un processus en cours d'exécution que l'utilisateur peut démarrer votre programme de n'importe où. Même si vous pensez que vous contrôlez toujours le répertoire de travail actuel, vous serez surpris de la fréquence à laquelle vous vous tromperez.

+0

L'ajout de System.IO.File.Exists est la meilleure méthode pour vérifier un fichier avant de l'utiliser. Cela empêche les exceptions qui consomment du temps et des ressources. –

0

utilisation \\ pour le répertoire de chemin du fichier si elle dans locale .. si votre fichier existe dans l'utilisation du chemin réseau \\\\ (atfirst) .. Pour que l'air pour lecteur réseau ..

Merci

0

Il est nécessaire d'incorporer tous les fichiers externes dans l'exécutable et de modifier votre code pour qu'il fonctionne avec ces fichiers incorporés plutôt que de s'attendre à des fichiers sur le disque. Pour utiliser des images ou tout ce dont vous avez besoin ("xml/txt/doc"), vous devez définir l'action de construction de votre fichier sur Embedded Resource, et appeler la méthode avec le nom complet du fichier, où le nom est assemblé comme ceci:

[RootNameSpaceOfTheProject]. [NameOfFolderInTheProject].[FileNameWithExtension]

Exemple:

enter image description here

appeler la méthode:

var b = ResourceOperations.GetResourceAsByteArray ("Store.Resources.EmbeddedIcons.toolbox.png"); Vous pouvez maintenant écrire le tableau d'octets dans un fichier temporaire par exemple et l'utiliser comme source d'image, ou vous pouvez directement créer une image à partir du tableau d'octets. Au moins, vous avez vos données ...

et d'enregistrer ces fichiers sur un disque que nous devrions écrire un code par @Jon Skeet:

public static void CopyStream(Stream input, Stream output) 
{ 
    // Insert null checking here for production 
    byte[] buffer = new byte[8192]; 

    int bytesRead; 
    while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     output.Write(buffer, 0, bytesRead); 
    } 
    } 

puis l'appeler:

using (Stream input = assembly.GetManifestResourceStream(resourceName)) 
    using (Stream output = File.Create(path)) 
    { 
     CopyStream(input, output); 
    }