在C#中一一读取文件夹中的文件

时间:2019-12-04 11:16:44

标签: c# json asp.net-core .net-core

我有一个简单的问题,但这使我发疯。 我有一个包含很多JSON文件的文件夹,我只需要一个个打开这些文件并执行操作。 因此,我需要打开第一个,阅读并做点什么,然后转到第二个,以此类推,直到最后一个。

这是我在网上搜索时尝试的代码:

string folderpath = @"C:\Users\rfo\Desktop\MM\VM DB\nv - master\nvd";
            var fixedfolderpath = Environment.ExpandEnvironmentVariables(folderpath);
            string [] filesnumber = Directory.GetFiles(fixedfolderpath, "*.json");
            foreach (string filename in filesnumber)
            {
                var jsonFull = System.IO.File.ReadAllText(filename);

但是我一直遇到错误DirectoryNotFoundException: Could not find a part of the path on the browser。 我正在使用asp.net CORE 3和Visual Studio 2019。

2 个答案:

答案 0 :(得分:0)

如果要从桌面获取文件,则可以使用以下方法:

string path = Path.Combine(
    Environment.GetFolderPath(Environment.SpecialFolder.Desktop), 
    @"MM\VM DB\nv - master\nvd");

但是您可能会遇到访问权限问题

答案 1 :(得分:0)

  1. 正如其他人建议的那样,最好将文件移动到解决方案中。例如,您可以将这些文件复制到项目文件夹中:

    ├───YourApp.csproj                      # your `*.csproj`
    ├───Controllers/
    ├───Models/
    ├───Views/
    ├───wwwroot/
    ├───MM/                                 # your target folder 
    │   └───VM/
    │       └───VM DB/
    │           └───nv - master/
    │               └───nvd/
    |                   └─── *.json
    
  2. 除此之外,别忘了在 *.csproj 文件中添加配置,这样您的json文件将在您构建/发布该应用程序:

      <ItemGroup>
        <None Update="MM\**\*.*">
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </None>
      </ItemGroup>
    
  3. 此外,您似乎正在使用ASP.NET Core而不是ASP.NET。如果是这样,您可以通过注入IWebHostEnvironment来引用此文件夹,以便调用webHostEnv.ContentRootPath来获取根目录(即,源代码中的项目文件方向,以及在出现以下情况时的YourAssembly.dll目录)已发布)。

    例如,您可以在控制器中注入IWebHostEnviroment实例:

    public class HomeController : Controller
    {
        private readonly IWebHostEnvironment _env;
        public HomeController(IWebHostEnvironment env)
        {
            this._env = env;
        }
        public IActionResult Privacy()
        {
            var dir = Path.Combine( this._env.ContentRootPath, @"MM\VM\VM DB\nv - master\nvd");
            string[] filesnumber = Directory.GetFiles(dir, "*.json");
            foreach (string filename in filesnumber)
            {
                var jsonFull = System.IO.File.ReadAllText(filename);
                ...
            }
            return Ok("hello,world");
         }
    }
    
  4. 最后,如果您不喜欢依赖注入或无法使用依赖注入,则可以使用相对于当前程序集的路径,如下所示:
     var assemDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
     var dir = Path.Combine(assemDir, @"MM\VM\VM DB\nv - master\nvd");
     string[] filesnumber = Directory.GetFiles(dir, "*.json");
    
    请注意,这不是最安全的方法。建议尽可能使用DI方法(IWebHostEnviroment)。