如何使用asp.net从文件夹中删除特定文件

Posted

技术标签:

【中文标题】如何使用asp.net从文件夹中删除特定文件【英文标题】:How to delete a specific file from folder using asp.net 【发布时间】:2012-12-24 10:40:30 【问题描述】:

这就是我得到一个名为 gridview1 的 datagridviewer 和一个 fileupload1 的交易,当我上传一个文件时,它会使用文件名和路径更新数据库中的 gridview1 和表,并将所述文件存储在文件夹“Mag”中......但是现在我想做的是相反我得到了如何使用gridview删除表条目但是从文件夹“Mag”中删除文件不起作用在C#或代码隐藏中使用了以下代码

protected void GridView1_Del(object sender, EventArgs e)  

    string DeleteThis = GridView1.SelectedRow.Cells[0].Text;
    string[] Files = Directory.GetFiles(@"i:/Website/WebSite3/Mag/");

    foreach (string file in Files)
    
        if (file.ToUpper().Contains(DeleteThis.ToUpper()))
        
            File.Delete(file);
        
    

它给了我错误

“对象引用未设置为对象的实例。”

请告诉我我做错了什么是新的,并且不必深入了解平台,因此我们将不胜感激任何和所有帮助 提前致谢 标记

这是我找到的答案感谢 Tammy 和其他所有人的所有答案

好的,这里的交易目标函数从gridview和数据库表中删除文件详细信息,并从存储文件的项目文件夹中删除文件

在您想要包含的 gridview 的脚本部分中

OnRowDeleting="FuntionName"

没有

OnSelectedIndexChanged = "FuntionName"

OnRowDeleted="FuntionName"

然后在 C# 代码中(代码隐藏)

protected void FuntionName(object sender, GridViewDeleteEventArgs e)
    
// storing value from cell
        TableCell cell = GridView1.Rows[e.RowIndex].Cells[0];

// full path required
        string fileName = ("i:/Website/WebSite3/Mag/" + cell.Text); 

    if(fileName != null || fileName != string.Empty)
    
       if((System.IO.File.Exists(fileName))) 
       
           System.IO.File.Delete(fileName);
       

     
  

仅供想学习的人参考

OnRowDeleting="FuntionName" 用于在删除一行之前,您可以像我一样取消删除或对数据运行函数

OnRowDeleted="FuntionName" 它直接删除

【问题讨论】:

在什么情况下您会遇到异常? 在哪一行给出异常? GridView1.SelectedRow.Cells[0].Text 在我看来很可疑 从您的代码字符串中删除这一行 DeleteThis = GridView1.SelectedRow.Cells[0].Text;返回正确的文件路径? 试试这个:if ((System.IO.File.Exists(fileName))) System.IO.File.Delete(fileName); 非常感谢@گلی 你的代码工作正常。 【参考方案1】:

这就是我删除文件的方式

if ((System.IO.File.Exists(fileName)))
                
                    System.IO.File.Delete(fileName);

还要确保您在删除中传递的文件名是准确的路径

编辑

您也可以使用以下事件,或者只使用此 sn-p 中的代码并在您的方法中使用

void GridView1_SelectedIndexChanged(Object sender, EventArgs e)
  

    // Get the currently selected row using the SelectedRow property.
    GridViewRow row = CustomersGridView.SelectedRow;

    //Debug this line and see what value is returned if it contains the full path.
    //If it does not contain the full path then add the path to the string.
    string fileName = row.Cells[0].Text 

    if(fileName != null || fileName != string.empty)
    
       if((System.IO.File.Exists(fileName))
           System.IO.File.Delete(fileName);

     
  

【讨论】:

在 ASP.Net 场景中... BP 到第一个check the file is not in use,然后再删除。 这是 asp.net 方案,该文件将不会被使用的时间还有@tammy 你会说程序从提到的文件夹中删除文件还是我必须添加路径才能发生这种情况跨度> 是的,如果我理解正确,您必须添加路径才能发生这种情况 @jeremey 是的,在我的情况下,它假设文件当前没有被使用,但我同意如果这是要求,检查锁的良好做法。 好的,所以只是为了确认(哦,告诉我,如果我的文件夹是“Mag”并且我的文件名存储在选定的行中,那么我可以这样做吗? code if ((System.IO.File.Exists("Mag/"+GridView1.SelectedRow.Cells[0].Text))) System.IO.File.Delete("Mag/"+GridView1.SelectedRow.单元格[0].Text); 【参考方案2】:

检查 GridView1.SelectedRow 是否为空:

if (GridView1.SelectedRow == null) return;
string DeleteThis = GridView1.SelectedRow.Cells[0].Text;

【讨论】:

SelectedRow 不是一个集合,所以检查它是否为空会是一个更好的提示。【参考方案3】:

在我的项目中,我使用 ajax,我在我的代码中创建了一个 web 方法,就像这样

前面

 $("#attachedfiles a").live("click", function () 
            var row = $(this).closest("tr");
            var fileName = $("td", row).eq(0).html();
            $.ajax(
                type: "POST",
                url: "SendEmail.aspx/RemoveFile",
                data: 'fileName: "' + fileName + '" ',
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function ()  ,
                failure: function (response) 
                    alert(response.d);
                
            );
            row.remove();
        );  

在后面的代码中

        [WebMethod]
        public static void RemoveFile(string fileName)
        
            List<HttpPostedFile> files = (List<HttpPostedFile>)HttpContext.Current.Session["Files"];
            files.RemoveAll(f => f.FileName.ToLower().EndsWith(fileName.ToLower()));

            if (System.IO.File.Exists(HttpContext.Current.Server.MapPath("~/Employee/uploads/" + fileName)))
            
                System.IO.File.Delete(HttpContext.Current.Server.MapPath("~/Employee/uploads/" + fileName));
            
        

我认为这会对你有所帮助。

【讨论】:

【参考方案4】:

从路径中删除任何或特定的文件类型(例如“.bak”)。 请参阅下面的演示代码 -

class Program
        
        static void Main(string[] args)
            

            // Specify the starting folder on the command line, or in 
            TraverseTree(ConfigurationManager.AppSettings["folderPath"]);

            // Specify the starting folder on the command line, or in 
            // Visual Studio in the Project > Properties > Debug pane.
            //TraverseTree(args[0]);

            Console.WriteLine("Press any key");
            Console.ReadKey();
            

        public static void TraverseTree(string root)
            

            if (string.IsNullOrWhiteSpace(root))
                return;

            // Data structure to hold names of subfolders to be
            // examined for files.
            Stack<string> dirs = new Stack<string>(20);

            if (!System.IO.Directory.Exists(root))
                
                return;
                

            dirs.Push(root);

            while (dirs.Count > 0)
                
                string currentDir = dirs.Pop();
                string[] subDirs;
                try
                    
                    subDirs = System.IO.Directory.GetDirectories(currentDir);
                    

                // An UnauthorizedAccessException exception will be thrown if we do not have
                // discovery permission on a folder or file. It may or may not be acceptable 
                // to ignore the exception and continue enumerating the remaining files and 
                // folders. It is also possible (but unlikely) that a DirectoryNotFound exception 
                // will be raised. This will happen if currentDir has been deleted by
                // another application or thread after our call to Directory.Exists. The 
                // choice of which exceptions to catch depends entirely on the specific task 
                // you are intending to perform and also on how much you know with certainty 
                // about the systems on which this code will run.
                catch (UnauthorizedAccessException e)
                    
                    Console.WriteLine(e.Message);
                    continue;
                    
                catch (System.IO.DirectoryNotFoundException e)
                    
                    Console.WriteLine(e.Message);
                    continue;
                    

                IEnumerable<FileInfo> files = null;
                try
                    
                    //get only .bak file
                    var directory = new DirectoryInfo(currentDir);
                    DateTime date = DateTime.Now.AddDays(-15);
                    files = directory.GetFiles("*.bak").Where(file => file.CreationTime <= date);
                    
                catch (UnauthorizedAccessException e)
                    
                    Console.WriteLine(e.Message);
                    continue;
                    
                catch (System.IO.DirectoryNotFoundException e)
                    
                    Console.WriteLine(e.Message);
                    continue;
                    

                // Perform the required action on each file here.
                // Modify this block to perform your required task.
                foreach (FileInfo file in files)
                    
                    try
                        
                        // Perform whatever action is required in your scenario.
                        file.Delete();
                        Console.WriteLine("0: 1, 2 was successfully deleted.", file.Name, file.Length, file.CreationTime);
                        
                    catch (System.IO.FileNotFoundException e)
                        
                        // If file was deleted by a separate application
                        //  or thread since the call to TraverseTree()
                        // then just continue.
                        Console.WriteLine(e.Message);
                        continue;
                        
                    

                // Push the subdirectories onto the stack for traversal.
                // This could also be done before handing the files.
                foreach (string str in subDirs)
                    dirs.Push(str);
                
            
        

更多参考 - https://msdn.microsoft.com/en-us/library/bb513869.aspx

【讨论】:

【参考方案5】:
string sourceDir = @"c:\current";
string backupDir = @"c:\archives\2008";

try

    string[] picList = Directory.GetFiles(sourceDir, "*.jpg");
    string[] txtList = Directory.GetFiles(sourceDir, "*.txt");

    // Copy picture files. 
    foreach (string f in picList)
    
        // Remove path from the file name. 
        string fName = f.Substring(sourceDir.Length + 1);

        // Use the Path.Combine method to safely append the file name to the path. 
        // Will overwrite if the destination file already exists.
        File.Copy(Path.Combine(sourceDir, fName), Path.Combine(backupDir, fName), true);
    

    // Copy text files. 
    foreach (string f in txtList)
    

        // Remove path from the file name. 
        string fName = f.Substring(sourceDir.Length + 1);

        try
        
            // Will not overwrite if the destination file already exists.
            File.Copy(Path.Combine(sourceDir, fName), Path.Combine(backupDir, fName));
        

        // Catch exception if the file was already copied. 
        catch (IOException copyError)
        
            Console.WriteLine(copyError.Message);
        
    

    // Delete source files that were copied. 
    foreach (string f in txtList)
    
        File.Delete(f);
    
    foreach (string f in picList)
    
        File.Delete(f);
    


catch (DirectoryNotFoundException dirNotFound)

    Console.WriteLine(dirNotFound.Message);

【讨论】:

以上是关于如何使用asp.net从文件夹中删除特定文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Asp.net 删除临时文件

如何从 asp.net 处理程序返回 404 错误?

如何使用asp.net核心从数据库中的特定行下载图像

Asp.Net Core:如何使浏览器在发送之前显示文件正在下载

如何使 ASP.NET Core Web API 操作异步执行?

如何在 ASP.NET Core 5 中向特定用户发送内容