C# Asp.NETMVC删除文件问题

C# Asp.NETMVC删除文件问题,c#,asp.net-mvc,C#,Asp.net Mvc,我对文件有问题 我正在做一个图像导入程序,以便客户端将其文件放在FTP服务器上,然后可以将其导入应用程序中 在导入过程中,我使用file.copy将FTP文件夹中的文件复制到另一个文件夹 public List<Visuel> ImportVisuel(int galerieId, string[] images) { Galerie targetGalerie = MemoryCache.GetGaleriById(galerieId);

我对文件有问题

我正在做一个图像导入程序,以便客户端将其文件放在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;
    }
public List ImportVisuel(int-galerieId,string[]images)
{
Galerie targetGalerie=MemoryCache.GetGaleriById(galerieId);
List ListFormats=MemoryCache.FormatImageToList();
int i=0;
List VISUELADLIST=新列表();
List visuelUpdateList=新列表();
List returnList=新列表();
foreach(图像中的字符串项)
{
i++;
Progress.ImportProgress[Progress.Guid]=“Image”+i+“sur”+images.Count()+“importées”;
字符串扩展名=Path.GetExtension(项);
字符串文件名=Path.GetFileName(项);
string originalPath=HttpContext.Current.Request.PhysicalApplicationPath+“Uploads\\”;
字符串destinationPath=HttpContext.Current.Server.MapPath(“~/Images/catalog”)+“\\”;
Visuel importImage=MemoryCache.GetVisualByFilName(文件名);
bool update=true;
如果(importImage==null){importImage=new Visuel();update=false;}
Size-imageSize=importImage.GetJpegImageSize(原始路径+文件名);
FormatImage format=ListFormats.Where(f=>f.width==imageSize.width&&f.height==imageSize.height).FirstOrDefault();
字符串saveFileName=Guid.NewGuid()+扩展名;
Copy(originalPath+fileName,destinationPath+saveFileName);
if(格式!=null)
{
importImage.format=格式;
开关(format.key)
{
案例“目录”:
importImage.fileName=保存文件名;
importImage.originalFileName=文件名;
importImage.docsier=目标Galerie;
importImage.docsier_id=targetGalerie.id;
importImage.filePath=“图像/目录/”;
importImage.largeur=图像大小.宽度;
importImage.hauteur=图像大小.高度;
importImage.isRoot=true;
if(update==false){MemoryCache.Add(ref importImage);returnList.Add(importImage);}
如果(update==true)VisueUpdateList.Add(importImage);
foreach(ListFormats中的FormatImage f)
{
如果(f.key.StartsWith(“目录”))
{
字符串[]键=f.key.Split(“”);
字符串destinationFileName=saveFileName.Insert(saveFileName.IndexOf('.'),“-”+键[1].ToString());
字符串destinationFileNameDeclinison=destinationPath+destinationFileName;
VisuelResizer declinison=新VisuelResizer();
保存(原始路径+文件名,f.width,f.height,1000,destinationFileNameDeclinison);
Visuel Visuel=MemoryCache.GetVisualByFilName(fileName.Insert(fileName.IndexOf('.'),“-”+键[1].ToString());
更新=真;
如果(visuel==null){visuel=new visuel();update=false;}
visuel.parent=importImage;
visuel.filePath=“图像/目录/”;
visuel.fileName=destinationFileName;
visuel.originalFileName=string.Empty;
visuel.format=f;
//visuel.dossier=targetGalerie;关于《倾盆大雨》
visuel.largeur=f.宽度;
visuel.hauteur=f.高度;
如果(更新==false)
{
添加(visuel);
}
其他的
{
VisueUpdateList.Add(visuel);
}
//导入。倾斜。添加(可视化);
}
}
打破
}
}
}
MemoryCache.Add(ref visualaddlist);
//执行基金会
MemoryCache.Update(参考VisueUpdateList);
退货清单;
}
对副本进行某些处理后(不再使用原始文件) 客户端有一个弹出窗口,询问他是否要删除ftp文件夹中的原始文件

如果他单击Ok,则在同一控制器上调用另一个方法 这种方法使用

public void DeleteImageFile(string[] files)
    {
        for (int i = 0; i < files.Length; i++)
        {
            File.Delete(HttpContext.Current.Request.PhysicalApplicationPath + files[i].Replace(@"/", @"\"));
        }
    }
public void DeleteImageFile(字符串[]文件)
{
for(int i=0;i
这个方法很好用,当我在其他上下文中使用它时,它确实会删除好的文件

但这里有一条错误消息:

进程无法访问文件。。。因为它被另一个进程使用

有人有主意吗

多谢各位

这是Process Explorer的屏幕截图


您可以通过使用c#锁来解决这个问题。只要将代码嵌入lock语句中,线程就会安全,并等待彼此完成处理。

这里有几件事可以做

1) 如果可以重新编程,则可以在此时使用Process Explorer,查看哪个进程正在锁定该文件,以及该进程是否处于锁定状态
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();