Ubuntu环境下F#读取同目录Markdown文件相对路径失效如何解决
问题根因
你尝试的相对路径写法均是相对于程序运行时的工作目录,而非源码文件的存放目录。使用IDE启动调试时,默认工作目录是编译输出的bin/Debug/[对应.NET版本]子目录,自然找不到上层项目目录里的File.md;而/File.md是读取系统根目录下的文件、~是Shell专属的家目录占位符,.NET运行时不会自动解析,因此都不生效。
可直接用于部署的解决方案
步骤1:配置文件自动复制到输出目录
修改你的ConsoleApp1.fsproj文件,加入以下配置,让编译时自动把File.md拷贝到和生成的可执行文件相同的目录:
<Project Sdk="Microsoft.NET.Sdk"> <!-- 原有配置保持不变 --> <ItemGroup> <None Update="File.md"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup> </Project>
步骤2:修改代码基于程序运行路径拼接文件路径
不要硬写相对路径,通过程序集自身的位置定位文件目录,适配所有运行环境:
open System.IO open System.Reflection [<EntryPoint>] let main argv = // 获取当前程序exe所在的目录 let exeDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) // 拼接得到File.md的完整路径,自动适配不同系统的路径分隔符 let filePath = Path.Combine(exeDir, "File.md") let text = File.ReadAllText(filePath) printfn "%s" text 0
开发阶段临时调试方案
如果仅在本地调试不想改配置,可以手动修改IDE的运行配置:把运行时的Working Directory设置为Program.fs和File.md所在的项目目录(即ConsoleApp1子目录),此时直接写File.ReadAllText("File.md")也能正常读取,但该方案不适合部署场景。
内容的提问来源于stack exchange,提问作者Garsty100
相关产品推荐
相关产品推荐

