【问题标题】:C# Directory does not exist error when it does existC# 目录不存在时出现错误
【发布时间】:2012-11-11 22:09:39
【问题描述】:

正如标题所解释的,我有一个程序可以在继续之前检查目录是否存在。

当检查完成时,它说目录不存在!

这是存储目录路径的代码:

string currentDirectory = Path.GetDirectoryName(Application.ExecutablePath);
Console.WriteLine("----" + currentDirectory.ToString());
string tesseractPath = Path.Combine(currentDirectory, @"..\..\..\tesseract");
_wrapper = new AsyncTesseractWrapper(tesseractPath);



public TesseractWrapper(string programLoc)
{
    DirectoryInfo dinfo = new DirectoryInfo(programLoc);
    //DirectoryInfo dinfo = new DirectoryInfo("C:\\Windows");
    ValidateTesseractDirectory(dinfo);
    _tesseractLocation = dinfo.FullName;
}

以及执行检查的代码:

private void ValidateTesseractDirectory(DirectoryInfo dinfo)
{
    if (!dinfo.Exists)               
        throw new ArgumentException("Specified program directory must exist.");
    FileInfo[] files;
    files = dinfo.GetFiles(_tessExe);
    if (files.Length != 1)
        throw new ArgumentException("Specified program directory must contain tesseract.exe.");
}

我已尝试使用多种变体进行调试,例如检查 C:\Windows 文件夹是否存在,但它仍然给我一个错误...

代码有问题,还是我对 .Exists 方法的理解有问题...?

谢谢!

【问题讨论】:

  • 我没有发现任何明显的错误。 Directory.Exists() 返回什么?你的环境有什么不寻常的地方吗,比如虚拟机?
  • tesseractPath 的实际计算值是多少?
  • .Exist 返回一个布尔值(取决于它是否存在)。而且没有虚拟机。虽然我刚刚意识到我应该尝试在一个干净的项目上测试相同的方法......但这也没有什么问题。
  • @SteveB 如果我console.writeline 它,这就是我得到的(有点长):C:\Users\Sulaiman\Desktop\Programming\Visual Studio 2010\Projects\PDF_Image_to_Excel_Converter\Image-OCR\ Atlasoft\TesseractLancher Files\tesseract 而且确实存在。我可以将其复制/粘贴到资源管理器中,然后文件夹就会打开。
  • @Sulaiman.89 如果您的路径已经很长,并且您正在从四个目录运行代码,您可能会遇到最大路径长度问题。 Win7 的最大值为 260。尝试将您的项目移动到 c:\MySweetProject\,看看是否得到相同的结果。

标签: c# file directory exists filesysteminfo


【解决方案1】:

可能是因为权限问题。引用 MSDN:

如果在尝试确定指定文件是否存在时发生任何错误,Exists 属性将返回 false。这可能发生在引发异常的情况下,例如传递包含无效字符或过多字符的文件名、磁盘故障或丢失,或者调用者没有读取文件的权限。

【讨论】:

  • 有道理,但这些例外都不适用于这种情况...我拥有完全访问权限并且没有使用任何无效字符。
【解决方案2】:

我认为问题在于微软已经改变了文件夹的结构,并且“显然”他们的员工仍在寻找“好的旧方法”。 过去,一个文件夹曾经有“..”,这是“文件夹标记”(当然是 dos),我可以看到这不再存在。 我做了什么:我将一个虚拟文件放入/复制到一个新文件夹、图像或其他任何东西中,而不是使用“目录”,而是使用 file.exists 我认为答案可能在属性中。

【讨论】:

    【解决方案3】:

    经历其实是一样的。这是由于使用软链接(包含有关文件夹信息的文本文件)而不是连接。

    递归加载第一个文件夹,然后是它们的文件并修复错误的连接。长文件名等。

    public static List<string> GetFilesEveryFolder(string folder, string mask, SearchOption searchOption, bool _trimA1 = false)
    {
        List<string> list = new List<string>(); ;
        List<string> dirs = null;
    
        try
        {
            dirs = GetFoldersEveryFolder(folder, "*").ToList();
        }
        catch (Exception ex)
        {
            throw new Exception("GetFiles with path: " + folder, ex);
        }
    
        foreach (var item in dirs)
        {
            try
            {
                list.AddRange(Directory.GetFiles(item, mask, SearchOption.TopDirectoryOnly));
            }
            catch (Exception ex)
            {
                // Not throw exception, it's probably Access denied on Documents and Settings etc
                //ThrowExceptions.FileSystemException(type, RH.CallingMethod(), ex);
            }
        }
    
        CA.ChangeContent(list, d => SH.FirstCharLower(d));
    
        if (_trimA1)
        {
            list = CA.ChangeContent(list, d => d = d.Replace(folder, ""));
        }
        return list;
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 1970-01-01
      • 2020-05-17
      • 2016-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多