代码之家  ›  专栏  ›  技术社区  ›  NoBullMan

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

  •  0
  • NoBullMan  · 技术社区  · 5 年前

    我列出了一个给定文件夹中的文件(日志文件),并允许下载该文件以及搜索所有文件中的给定文本。搜索不起作用。

    我试图下载这些文件,发现对于今天的文件,我得到了“错误:进程无法访问文件'Z:\abcd.log',因为它正被另一个进程使用。”。我联系了生成此日志文件的开发人员,他们告诉我,今天的日志文件一直打开到午夜(他没有执行打开/写入/关闭)。

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

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

    我改成:

    fStream = new FileStream(filepath, FileMode.Open, FileAccess.Read, 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中使用了StreamReader。阅读模式。它无法与具有文件读/写权限的其他应用程序共享文件。根据这篇帖子(对我来说也很有效)的说法,解决方案是写自己的ReadAllLines。以下代码来自帖子,以防帖子在某一天消失。

    public string[] WriteSafeReadAllLines(String path)
    {
        using (var csv = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
        using (var sr = new StreamReader(csv))
        {
            List<string> file = new List<string>();
            while (!sr.EndOfStream)
            {
                file.Add(sr.ReadLine());
            }
            return file.ToArray();
        }
    }
    
    0 回复  |  直到 5 年前