2017-04-26 64 views
0

我遇到文件问题。Asp.Net Mvc删除文件问题

我正在做一个图像导入程序,以便客户端将他们的文件放在FTP服务器上,然后他们可以将它导入到应用程序中。

在导入过程中,我的FTP文件夹中的文件复制到另一个文件夹File.copy

public List<Visuel> ImportVisuel(int galerieId, string[] images) 
    { 

     Galerie targetGalerie = MemoryCache.GetGaleriById(galerieId); 
     List<FormatImage> listeFormats = MemoryCache.FormatImageToList(); 
     int i = 0; 

     List<Visuel> visuelAddList = new List<Visuel>(); 
     List<Visuel> visuelUpdateList = new List<Visuel>(); 
     List<Visuel> returnList = new List<Visuel>(); 
     foreach (string item in images) 
     { 
      i++; 
      Progress.ImportProgress[Progress.Guid] = "Image " + i + " sur " + images.Count() + " importées"; 
      string extension = Path.GetExtension(item); 
      string fileName = Path.GetFileName(item); 
      string originalPath = HttpContext.Current.Request.PhysicalApplicationPath + "Uploads\\"; 
      string destinationPath = HttpContext.Current.Server.MapPath("~/Images/Catalogue") + "\\"; 
      Visuel importImage = MemoryCache.GetVisuelByFilName(fileName); 
      bool update = true; 
      if (importImage == null) { importImage = new Visuel(); update = false; } 

      Size imageSize = importImage.GetJpegImageSize(originalPath + fileName); 
      FormatImage format = listeFormats.Where(f => f.width == imageSize.Width && f.height == imageSize.Height).FirstOrDefault(); 
      string saveFileName = Guid.NewGuid() + extension; 


      File.Copy(originalPath + fileName, destinationPath + saveFileName); 


      if (format != null) 
      { 
       importImage.format = format; 
       switch (format.key) 
       { 
        case "Catalogue": 
         importImage.fileName = saveFileName; 
         importImage.originalFileName = fileName; 
         importImage.dossier = targetGalerie; 
         importImage.dossier_id = targetGalerie.id; 
         importImage.filePath = "Images/Catalogue/"; 
         importImage.largeur = imageSize.Width; 
         importImage.hauteur = imageSize.Height; 
         importImage.isRoot = true; 
         if (update == false) { MemoryCache.Add(ref importImage); returnList.Add(importImage); } 
         if (update == true) visuelUpdateList.Add(importImage); 
         foreach (FormatImage f in listeFormats) 
         { 
          if (f.key.StartsWith("Catalogue_")) 
          { 
           string[] keys = f.key.Split('_'); 
           string destinationFileName = saveFileName.Insert(saveFileName.IndexOf('.'), "-" + keys[1].ToString()); 
           string destinationFileNameDeclinaison = destinationPath + destinationFileName; 
           VisuelResizer declinaison = new VisuelResizer(); 
           declinaison.Save(originalPath + fileName, f.width, f.height, 1000, destinationFileNameDeclinaison); 

           Visuel visuel = MemoryCache.GetVisuelByFilName(fileName.Insert(fileName.IndexOf('.'), "-" + keys[1].ToString())); 
           update = true; 
           if (visuel == null) { visuel = new Visuel(); update = false; } 

           visuel.parent = importImage; 

           visuel.filePath = "Images/Catalogue/"; 
           visuel.fileName = destinationFileName; 
           visuel.originalFileName = string.Empty; 
           visuel.format = f; 
           //visuel.dossier = targetGalerie; On s'en fout pour les déclinaisons 
           visuel.largeur = f.width; 
           visuel.hauteur = f.height; 
           if (update == false) 
           { 
            visuelAddList.Add(visuel); 
           } 
           else 
           { 
            visuelUpdateList.Add(visuel); 
           } 
           //importImage.declinaisons.Add(visuel); 
          } 
         } 
         break; 
       } 
      } 

     } 
     MemoryCache.Add(ref visuelAddList); 

     // FONCTION à implémenter 
     MemoryCache.Update(ref visuelUpdateList); 
     return returnList; 
    } 

副本上的某些进程后(原始文件不再被使用) 客户端有个弹出询问他是否要删除ftp文件夹中的原始文件。

如果他点击就OK了另一种方法被称为同一个控制器 对这种方法使用

public void DeleteImageFile(string[] files) 
    { 
     for (int i = 0; i < files.Length; i++) 
     { 
      File.Delete(HttpContext.Current.Request.PhysicalApplicationPath + files[i].Replace(@"/", @"\")); 
     } 
    } 

这种方法效果很好,真正删除好文件,当我在其他环境中使用它。

但在这里我有一个错误信息:

进程无法存取权限文件...因为它是由另一个进程使用。

有人有想法吗?

谢谢。

这里的Process Explorer中的

enter image description here

+0

你什么时候遇到这个错误?删除文件后? –

+0

当我想要删除它时,当我调用删除命令时发生错误 – Julien

+0

您是否事先正确关闭了文件? – Gilles

回答

0

我找到了解决办法:

在我的导入方法,有没有调用该方法

public void Save(string originalFile, int maxWidth, int maxHeight, int quality, string filePath) 
     { 
      Bitmap image = new Bitmap(originalFile); 
      Save(ref image, maxWidth, maxHeight, quality, filePath); 
     } 

位图保持打开的文件阻塞删除。

只是在methos添加

image.Dispose(); 

,它做工精细。

谢谢你的帮助,并感谢你的进程资源管理器。非常有用的工具

0

通过使用C#锁解决这个问题的屏幕截图。只需将您的代码嵌入到锁语句中,您的线程就会安全并等待对方完成处理。

+0

我试过了,但不起作用。 问题仍然存在 – Julien

1

有几件事你可以在这里做。

1)如果你可以重新制作它,你可以在那个时候使用Process Explorer,看看哪个进程正在锁定文件,如果进程是你的进程,那么确保在你的工作完成后关闭文件句柄。

2)在删除语句周围使用try/catch并在几秒后重试以查看文件句柄是否被释放。

3)如果你可以离线执行它,你可以放入一些队列并在稍后进行删除。

+0

我无法离线执行此操作。这是一个网络应用程序。 尝试捕捉也不起作用。在循环中调用catch。 你如何关闭文件句柄? 我使用的文件类,我没有看到任何东西 谢谢 – Julien

+0

当你得到异常,将其添加到一个数组,然后在某个时间后重试 – loneshark99

+0

@Julien你可以显示代码。 – loneshark99