2012-04-12 3 views
0

Je chargement des vignettes d'images dans un contrôle ListView avec succès:images File.Move d'un contrôle ListView

lsvImageThumbs.Items.Clear(); 
     imgl_ImageThumbs.Images.Clear(); 

     string[] files = Directory.GetFiles(@"C:\Documents and Settings\Etc\Desktop\Test"); 

     for (int indexFiles = 0; indexFiles < files.Length; indexFiles++) 
     { 
      Image img = Image.FromFile(files[indexFiles]); 
      DirectoryInfo dinfo = new DirectoryInfo(files[indexFiles]); 
      imgl_ImageThumbs.Images.Add(dinfo.Name, img); 
      lsvImageThumbs.Items.Add(files[indexFiles], dinfo.Name, indexFiles); 
     } 

Ensuite, je peux sélectionner les vignettes d'image et que vous souhaitez déplacer les fichiers dans un répertoire:

if (dlg.ShowDialog() == DialogResult.OK) 
       { 
        foreach (ListViewItem items in lsvImageThumbs.SelectedItems) 
        { 
         //File.Copy(items.Name, dlg.SelectedPath + "\\" + items.Text); 
         File.Move(items.Name, dlg.SelectedPath + "\\" + items.Text); 
         MessageBox.Show(items.Text + " Taken"); 
        } 
       } 

File.Copy fonctionne sans problème, mais pour File.Move je reçois l'erreur suivante:

The process cannot access the file because it is being used by another process. 
+0

Et votre question est? – Jodrell

+1

Comment éviter le verrouillage - http://stackoverflow.com/questions/3661799/file-delete-failing-when-image-fromfile-was-called-prior-it-despite-making-copy – Nikolay

+0

@Nikolay, je vous soupçonne ont raison – Jodrell

Répondre

1

S'il vous plaît noter que J'ai également répondu à la même question sur les forums MSDN. Image.FromFile verrouille le fichier jusqu'à ce que l'image soit éliminée. C'est la raison pour laquelle vous obtenez l'erreur. Vous pouvez contourner cela en copiant le fichier en mémoire et utiliser la copie dans votre ImageList.

Exemple:

ImageList list = new ImageList(); 

Image diskImage = Image.FromFile("mypic.jpg"); 
Image memoryImage = new Bitmap(diskImage); 

diskImage.Dispose(); // Releases the lock 

list.Images.Add(memoryImage); 

changements à votre code:

lsvImageThumbs.Items.Clear(); 
imgl_ImageThumbs.Images.Clear(); 

string[] files = Directory.GetFiles(@"C:\Documents and Settings\Etc\Desktop\Test"); 

for (int indexFiles = 0; indexFiles < files.Length; indexFiles++) { 
    Image img = Image.FromFile(files[indexFiles]); 

    // Create a copy of the image in memory 
    Image memImg = new Bitmap(img); 

    // Dispose of the original and release the file system lock 
    img.Dispose(); 

    DirectoryInfo dinfo = new DirectoryInfo(files[indexFiles]); 

    // Updated this line to add memImg 
    imgl_ImageThumbs.Images.Add(dinfo.Name, memImg); 

    lsvImageThumbs.Items.Add(files[indexFiles], dinfo.Name, indexFiles); 
} 

Votre File.Move devrait maintenant fonctionner.
Image.FromFile on MSDN