Winform

/// <summary>
/// 复制或剪切文件至剪贴板(方法)
/// </summary>
/// <param name="files">需要添加到剪切板的文件路径数组</param>
/// <param name="cut">是否剪切true为剪切,false为复制</param>
public static void CopyToClipboard(string[] files, bool cut)
{
    if (files == null) 
        return;

    IDataObject data = new DataObject(DataFormats.FileDrop, files);

    MemoryStream memo = new MemoryStream(4);

    byte[] bytes = new byte[] { (byte)(cut ? 2 : 5), 0, 0, 0 };

    memo.Write(bytes, 0, bytes.Length);

    data.SetData("Preferred DropEffect", memo);

    Clipboard.SetDataObject(data);
}


/// <summary>
/// 获取剪贴板中的文件列表(方法)
/// </summary>
/// <returns>System.Collections.List<string>返回剪切板中文件路径集合</returns>
public static List<string> GetClipboardList()
{
    List<string> clipboardList = new List<string>();

    IDataObject dataObject = Clipboard.GetDataObject();

    if (dataObject.GetDataPresent(DataFormats.FileDrop))
    {
        System.Collections.Specialized.StringCollection sc = Clipboard.GetFileDropList();

        for (int i = 0; i < sc.Count; i++)
        {
            string listfileName = sc[i];

            clipboardList.Add(listfileName);
        }
    }

    return clipboardList;
}


/// <summary>
/// 获取剪贴板中的文件列表(方法)
/// </summary>
/// <param name="cut">true:剪切;false:复制</param>
/// <returns>System.Collections.List<string>返回剪切板中文件路径集合</returns>
public static List<string> GetClipboardList(out bool cut)
{
    List<string> clipboardList = new List<string>();

    cut = false;

    IDataObject dataObject = Clipboard.GetDataObject();

    if (dataObject.GetDataPresent(DataFormats.FileDrop))
    {
        MemoryStream memoryStream = (MemoryStream)dataObject.GetData("Preferred DropEffect", true);

        DragDropEffects dragDropEffects = (DragDropEffects)memoryStream.ReadByte();

        if ((dragDropEffects & DragDropEffects.Move) == DragDropEffects.Move)
        {
            cut = true;
        }

        StringCollection sc = Clipboard.GetFileDropList();

        for (int i = 0; i < sc.Count; i++)
        {
            string listfileName = sc[i];

            clipboardList.Add(listfileName);
        }
    }

    return clipboardList;
}

静态文件(static files),诸如 HTML、CSS、图片和 JavaScript 之类的资源会被 ASP.NET Core 应用直接提供给客户端。

静态文件服务

// 安装 StaticFiles 包
Install-Package Microsoft.AspNetCore.StaticFiles

在应用程序中,我们可以通过配置 StaticFiles 中间件来启用静态文件服务,将 StaticFiles 中间件加入到管道中:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseStaticFiles(); 
}

静态文件通常位于 web root(/wwwroot)文件夹下。我们通常会把项目的当前目录设置为 content root,这样项目的 web root 就可以在开发阶段被明确。

  • http://(app)/(fileName)
  • http://localhost:9189/1.jpg
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseStaticFiles(new StaticFileOptions()
    {
        FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), @"MyStaticFiles")),
        RequestPath = new PathString("/StaticFiles")
    });
}

静态文件也可以保存在网站根目录下的任意文件夹内,可以通过相对根路径来访问。

  • http://(app)/StaticFiles/(fileName)
  • http://localhost:9189/StaticFiles/1.jpg

ASP.NET Core 内置的服务容器意图在于提供框架的基本需求,使大多数客户应用程序建立在它之上。

当然,开发人员也可以很容易地使用他们的首选容器替换默认容器。ConfigureServices 方法通常返回 void,但是如果改变它的签名返回 IServiceProvider,就可以配置并返回一个不同的容器。

在开发过程中有很多 IOC 容器可供选择,这里就是一个使用 Autofac 包实现的例子。

1.在项目中安装 Autofac

Install-Package Autofac
Install-Package Autofac.Extensions.DependencyInjection

2.在 ConfigureServices 中配置容器并返回 IServiceProvider

public class Startup
{
    public IServiceProvider ConfigureServices(IServiceCollection services)
    {
      // Add Autofac
      var containerBuilder = new ContainerBuilder();
      containerBuilder.Populate(services);
      containerBuilder.RegisterModule<AutofacModule>();
      Startup.AutofacContainer = containerBuilder.Build();
      return new AutofacServiceProvider(Startup.AutofacContainer);
    }

    public static IContainer AutofacContainer { get; set; }
}

注意: Populate 方法和 RegisterModule 的顺序,它们都是在 Aotofac 容器中注册服务,在配置过程中,相同的接口会被后注册的服务覆盖。