簡體   English   中英

Asp.Net Mvc刪除文件問題

[英]Asp.Net Mvc Delete file issue

我的文件有問題。

我正在執行圖像導入程序,因此客戶端將其文件放在FTP服務器上,然后可以將其導入應用程序中。

在導入過程中,我使用File.copy將FTP文件夾中的文件復制到另一個文件夾

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文件夾中的原始文件。

如果他單擊“確定”,則在同一控制器上調用另一種方法,並且該方法使用

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

當我在其他上下文中使用此方法時,此方法效果很好,並且實際上刪除了好的文件。

但是這里有一條錯誤消息:

進程無法訪問文件...因為它已被另一個進程使用。

有人有主意嗎?

謝謝。

這是Process Explorer的屏幕截圖

在此處輸入圖片說明

您可以在這里做幾件事。

1)如果可以對其進行復制,則可以在那時使用Process Explorer,查看哪個進程正在鎖定文件,如果該進程是您的進程,則請確保在完成工作后關閉文件句柄。

2)在delete語句周圍使用try/catch ,然后在幾秒鍾后重試以查看文件句柄是否已釋放。

3)如果您可以脫機執行此操作,則可以將其放入隊列,然后稍后對其進行刪除。

您可以使用c#鎖解決此問題。 只需將您的代碼嵌入lock語句中,您的線程將很安全,並且彼此等待以完成處理。

我找到了解決方案:

在我的導入方法中,有一個對該方法的調用

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);
        }

位圖維護打開的文件,阻止刪除。

剛剛添加

image.Dispose();

在方法上,它工作正常。

感謝您的幫助,也感謝您的流程瀏覽器。 非常有用的工具

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM