如何访问项目C#

时间:2019-05-06 09:27:56

标签: c#

当前,我在项目中获得了文件夹的完整路径。从长远来看,这是不可持续的。我需要这样的东西

var path = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);

但我不想访问bin/Debug文件夹,而是要访问bin/tessdata文件夹(tessdata是自定义文件夹)。

我看了其他一些帖子,但所有帖子都放在bin/Debug文件夹中。

这就是它从一开始就应该工作的方式 var ocr = new TesseractEngine("./tessdata", "eng", Tesseract.EngineMode.TesseractAndCube);,但我无法通过./tessdata访问该文件夹。

有人解决这两个问题吗?谢谢!

修改

对不起,我误会了这种情况。我实际上是在尝试到达另一层tessdata文件夹内的bin/debug文件夹。该代码正在该项目中运行,但我不知道路径已转到正在运行的项目(winform或webAPi项目)。基本上是Project\LicensePlate.Core\bin\Debug\tessdata

给您带来的不便,我们深表歉意,但仍然希望能获得一些帮助!

4 个答案:

答案 0 :(得分:1)

如果文件夹始终为bin / tessdata,请使用:

var path = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + "/../tessdata";

否则,在编译过程中执行任务并将bin/tessdata复制到bin/debug/tessdata

答案 1 :(得分:0)

var path = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);

idea可以很好地获取应用程序的运行位置(因此原因是从visual studio启动时在bin / Debug中),并且即使在部署时也可以正常工作。 如果将./tesseractdata文件夹放在可执行文件的旁边,这就是方法。调试时可能会发现一些不一致之处,这可能是由于解决方案中的文件与源文件位于“ tesseractdata”文件夹中位于同一级别。如果是这样,可以在VS的文件属性中使用“复制到输出目录”标志。

答案 2 :(得分:0)

您可以编写如下函数来获取正在执行的程序集并搜索所有文件/文件夹。 (在这里我提到从bin的文件夹中搜索文件 目录。

  public static string GetExternalToolsExecutablePath(string externalAssemblyName)
    {
        try
        {
            var assemblyLocation = Assembly.GetEntryAssembly().Location;
            var directories = Path.GetDirectoryName(assemblyLocation);
            if (directories != null && Directory.Exists(directories))
            {
                var dirInfo = new DirectoryInfo(directories);
                var executable = dirInfo.GetFiles(externalAssemblyName, SearchOption.AllDirectories)
                    .Select(a => a.FullName).FirstOrDefault();
                return !string.IsNullOrEmpty(executable) ? executable : null;
            }
            return null;
        }
        catch (Exception e)
        {

            return null;
        }
    }

确保已在每个版本上复制了必需的文件,因此请使用构建脚本在每个版本上进行复制。

echo "Copy BIN FOLDER files..."
xcopy %ProjectDir%"XXXXXXXX\*.*" %TargetDir%"\XXXXXXX\" /Y /I /E /R>nul

根据您的情况,您可以根据文件类型对功能进行一些更改。

答案 3 :(得分:0)

这里使用了GetDirectoryName()函数,它以汇编位置(目录+应用程序Dll的位置路径)返回,返回类型为字符串。

出于您的目的,请在代码中使用以下更改。

var path = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + "\\tessdata";

它返回您的例外路径位置。但是My Advise使用环境变量,否则您将在其他环境中遇到一些问题。这是环境变量的引用。

https://docs.microsoft.com/en-us/dotnet/api/system.environment?view=netframework-4.8