当前位置: 移动技术网 > IT编程>开发语言>.net > ASP.NET Core 2.0 本地文件操作问题及解决方案

ASP.NET Core 2.0 本地文件操作问题及解决方案

2017年11月02日  | 移动技术网IT编程  | 我要评论

广州必瘦站,澳门永利赌场广水信息,星梦天使国语

问题

如何在asp.net core 2.0中受限地访问本地目录和文件信息?

答案

新建一个空项目,修改startup类,添加访问本地文件所需的服务:

public void configureservices(iservicecollection services)
{
 services.addsingleton<ifileprovider>(
  new physicalfileprovider(directory.getcurrentdirectory()));
}

创建一个中间件,读取根目录下的所有文件,输出文件名:

public class hellofileprovidermiddleware
{
 private readonly requestdelegate _next;
 private readonly ifileprovider _fileprovider;
 public hellofileprovidermiddleware(requestdelegate next, ifileprovider fileprovider)
 {
  _next = next;
  _fileprovider = fileprovider;
 }
 public async task invoke(httpcontext context)
 {
  var output = new stringbuilder("");
  idirectorycontents dir = _fileprovider.getdirectorycontents("");
  foreach (ifileinfo item in dir)
  {
   output.appendline(item.name);
  }
  await context.response.writeasync(output.tostring());
 }
}
public static class usehellofileproviderextensions
{
 public static iapplicationbuilder usehellofileprovider(this iapplicationbuilder app)
 {
  return app.usemiddleware<hellofileprovidermiddleware>();
 }
}

运行,此时页面效果:

当然,我们也可以通过ifileprovider接口读取单个文件信息:

public class hellofileprovidermiddleware
{
 private readonly requestdelegate _next;
 private readonly ifileprovider _fileprovider;
 public hellofileprovidermiddleware(requestdelegate next, ifileprovider fileprovider)
 {
  _next = next;
  _fileprovider = fileprovider;
 }
 public async task invoke(httpcontext context)
 {
  ifileinfo file = _fileprovider.getfileinfo("startup.cs");
  using (var stream = file.createreadstream())
  {
   using (var reader = new streamreader(stream))
   {
    var output = await reader.readtoendasync();
    await context.response.writeasync(output.tostring());
   }
  }
 }
}

运行,此时页面效果:

讨论

asp.net core 2.0提供了继承自接口ifileprovider的physicalfileprovider类型,用于受限地访问本地文件系统,它是对system.io.file的一个封装。

我们可以在startup的configure()方法内将ifileprovider配置为一个服务,然后通过构造函数注入添加到中间件或者控制器中。这样可以在一个地方控制文件的访问路径(也就是应用程序启动的时候)。

ifileprovider有两个重要的方法:

1. getdirectorycontents:返回idirectorycontents接口。可用于遍历某个目录中的全部文件或目录。

2. getfileinfo:返回ifileinfo接口。通过其createreadsteam方法可以读取文件内容。

====start by sanshi=========================

下面通过递归来遍历根目录下全部文件和目录,修改中间件代码:

public class hellofileprovidermiddleware
{
 private readonly requestdelegate _next;
 private readonly ifileprovider _fileprovider;
 public hellofileprovidermiddleware(requestdelegate next, ifileprovider fileprovider)
 {
  _next = next;
  _fileprovider = fileprovider;
 }
 public async task invoke(httpcontext context)
 {
  var output = new stringbuilder("");
  resolvedirectory(output, "", "");
  await context.response.writeasync(output.tostring());
 }
 private void resolvedirectory(stringbuilder output, string path, string prefix)
 {
  idirectorycontents dir = _fileprovider.getdirectorycontents(path);
  foreach (ifileinfo item in dir)
  {
   if (item.isdirectory)
   {
    output.appendline(prefix + "[" + item.name + "]");
    resolvedirectory(output,
     item.physicalpath.substring(directory.getcurrentdirectory().length),
     prefix + " ");
   } else
   {
    output.appendline(prefix + item.name);
   }
  }
 }
} 

运行,此时页面效果:

====end by sanshi=========================

总结

以上所述是小编给大家介绍的asp.net core 2.0 本地文件操作问题及解决方案,希望对大家有所帮助

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网