“正在使用文件”错误导致搜索特定文本失败

如何解决“正在使用文件”错误导致搜索特定文本失败

我正在列出给定文件夹中的文件(日志文件),并允许下载文件以及在所有文件搜索给定的文本。搜索无效。

我尝试下载文件,并注意到今天的文件,我收到“错误:该进程无法访问文件'Z:\ abcd.log',因为该文件正在被另一个进程使用。”我联系了生成此日志文件的开发人员,并被告知今天的日志文件一直保持打开状态,直到午夜(他没有进行打开/写入/关闭操作)。

在我的下载文件代码中,我正在使用:

fStream = new FileStream(filepath,FileMode.Open,FileAccess.Read,FileShare.Read);

我将其更改为:

fStream = new FileStream(filepath,FileShare.ReadWrite); 

解决了下载问题;但是搜索仍然无法进行,我需要一些帮助。

我使用的ReadAllLines以我的理解(可能是错误的)打开和关闭文件

public string SearchFiles(string SearchStr,string FolderName,string DaysPrior)
{
    string JSONresult = string.Empty;
    var dir = Server.UrlDecode(FolderName);
    System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(dir);
    int iDaysPrior = 0;

    if (!string.IsNullOrEmpty(DaysPrior))
        iDaysPrior = int.Parse(DaysPrior);

    var fileList = di.GetFiles().Where(x => x.LastWriteTime.Date >= DateTime.Today.AddDays(0 - iDaysPrior)).OrderByDescending(f => f.LastWriteTime);

    foreach (System.IO.FileInfo fi in fileList)
    {
        foreach (var line in File.ReadAllLines(fi.FullName))
        {
            // Using custom extension method
            if (line.Contains(SearchStr,StringComparison.CurrentCultureIgnoreCase))
            {
                // Do something
            }
        }
    }
    return JSONresult;
}

解决方,请参见由psubsee2003提供的信誉和解决方案的注释。

问题在于,ReadAllLines最后在FileAccess.Read模式下使用StreamReader。它不能与具有对该文件的读/写访问权限的另一个应用程序共享文件。根据帖子(对我有用)的解决方案是编写您自己的ReadAllLines。后面的代码来自帖子,以防帖子itelf一天消失。

public string[] WriteSafeReadAllLines(String path)
{
    using (var csv = new FileStream(path,FileShare.ReadWrite))
    using (var sr = new StreamReader(csv))
    {
        List<string> file = new List<string>();
        while (!sr.EndOfStream)
        {
            file.Add(sr.ReadLine());
        }
        return file.ToArray();
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?