ASP.NET Core의 파일 공급자File Providers in ASP.NET Core

작성자: Steve SmithLuke LathamBy Steve Smith and Luke Latham

ASP.NET Core에서 파일 공급자를 사용하여 파일 시스템 액세스를 추상화합니다.ASP.NET Core abstracts file system access through the use of File Providers. 파일 공급자는 ASP.NET Core 프레임워크 전체에서 사용됩니다.File Providers are used throughout the ASP.NET Core framework:

  • IWebHostEnvironment는 앱의 콘텐츠 루트웹 루트IFileProvider 형식으로 노출합니다.IWebHostEnvironment exposes the app's content root and web root as IFileProvider types.
  • 정적 파일 미들웨어는 파일 공급자를 사용해서 정적 파일을 찾습니다.Static File Middleware uses File Providers to locate static files.
  • Razor는 파일 공급자를 사용하여 페이지 및 뷰를 찾습니다.Razor uses File Providers to locate pages and views.
  • .NET Core 도구는 파일 공급자와 GLOB 패턴을 사용해서 게시해야 할 파일을 지정합니다..NET Core tooling uses File Providers and glob patterns to specify which files should be published.

예제 코드 살펴보기 및 다운로드 (다운로드 방법)View or download sample code (how to download)

파일 공급자 인터페이스File Provider interfaces

기본 인터페이스는 IFileProvider입니다.The primary interface is IFileProvider. IFileProvider는 다음을 수행하는 메서드를 노출합니다.IFileProvider exposes methods to:

IFileInfo는 파일 작업에 대한 메서드 및 속성을 제공합니다.IFileInfo provides methods and properties for working with files:

IFileInfo.CreateReadStream 메서드를 사용하여 파일에서 읽을 수 있습니다.You can read from the file using the IFileInfo.CreateReadStream method.

샘플 앱은 종속성 주입을 통해 앱 전체에서 사용하기 위해 Startup.ConfigureServices에 파일 공급자를 구성하는 방법을 보여 줍니다.The sample app demonstrates how to configure a File Provider in Startup.ConfigureServices for use throughout the app via dependency injection.

파일 공급자 구현File Provider implementations

IFileProvider의 세 가지 구현을 사용할 수 있습니다.Three implementations of IFileProvider are available.

구현Implementation 설명Description
PhysicalFileProviderPhysicalFileProvider 물리적 공급자는 시스템의 물리적 파일에 액세스하기 위해서 사용됩니다.The physical provider is used to access the system's physical files.
ManifestEmbeddedFileProviderManifestEmbeddedFileProvider 매니페스트 임베디드 공급자는 어셈블리에 포함된 파일에 액세스하기 위해서 사용됩니다.The manifest embedded provider is used to access files embedded in assemblies.
CompositeFileProviderCompositeFileProvider 마지막으로 복합 공급자는 하나 이상의 개별 공급자로부터 얻어진 파일 및 디렉터리에 대한 복합적인 접근을 지원하기 위해서 사용됩니다.The composite provider is used to provide combined access to files and directories from one or more other providers.

PhysicalFileProviderPhysicalFileProvider

PhysicalFileProvider 는 실제 파일 시스템에 대한 접근을 제공합니다.The PhysicalFileProvider provides access to the physical file system. PhysicalFileProviderSystem.IO.File 형식(물리적 공급자에 대해)을 사용하고 디렉터리와 그 하위 자식에 대한 모든 경로의 범위를 지정합니다.PhysicalFileProvider uses the System.IO.File type (for the physical provider) and scopes all paths to a directory and its children. 이 범위 지정은 지정된 디렉터리와 그 하위 자식 이외의 파일 시스템에 대한 액세스를 방지합니다.This scoping prevents access to the file system outside of the specified directory and its children. 가장 공통적인 PhysicalFileProvider 생성 및 사용 시나리오는 종속성 주입을 통해 생성자 내에 IFileProvider를 요청하는 것입니다.The most common scenario for creating and using a PhysicalFileProvider is to request an IFileProvider in a constructor through dependency injection.

이 공급자를 직접 인스턴스화하는 경우 디렉터리 경로가 필요하며, 공급자를 사용하여 수행한 모든 요청에 대한 기본 경로로 사용됩니다.When instantiating this provider directly, a directory path is required and serves as the base path for all requests made using the provider.

다음 코드는 PhysicalFileProvider를 생성하고 이를 사용하여 디렉터리 콘텐츠 및 파일 정보를 가져오는 방법을 보여 줍니다.The following code shows how to create a PhysicalFileProvider and use it to obtain directory contents and file information:

var provider = new PhysicalFileProvider(applicationRoot);
var contents = provider.GetDirectoryContents(string.Empty);
var fileInfo = provider.GetFileInfo("wwwroot/js/site.js");

이전 예제의 형식:Types in the preceding example:

  • providerIFileProvider입니다.provider is an IFileProvider.
  • contentsIDirectoryContents입니다.contents is an IDirectoryContents.
  • fileInfoIFileInfo입니다.fileInfo is an IFileInfo.

파일 공급자는 applicationRoot로 지정된 디렉터리를 반복하거나 GetFileInfo를 호출하여 파일 정보를 가져오는 데 사용될 수 있습니다.The File Provider can be used to iterate through the directory specified by applicationRoot or call GetFileInfo to obtain a file's information. 파일 공급자는 applicationRoot 디렉터리 외에는 액세스 권한이 없습니다.The File Provider has no access outside of the applicationRoot directory.

샘플 앱은 IHostingEnvironment.ContentRootFileProvider를 사용하여 앱의 Startup.ConfigureServices 클래스에 공급자를 생성합니다.The sample app creates the provider in the app's Startup.ConfigureServices class using IHostingEnvironment.ContentRootFileProvider:

var physicalProvider = _env.ContentRootFileProvider;

ManifestEmbeddedFileProviderManifestEmbeddedFileProvider

ManifestEmbeddedFileProvider는 어셈블리에 포함된 파일에 접근하기 위한 용도로 사용됩니다.The ManifestEmbeddedFileProvider is used to access files embedded within assemblies. ManifestEmbeddedFileProvider는 어셈블리로 컴파일된 매니페스트를 사용하여 포함된 파일의 원래 경로를 재구성합니다.The ManifestEmbeddedFileProvider uses a manifest compiled into the assembly to reconstruct the original paths of the embedded files.

Microsoft.Extensions.FileProviders.Embedded 패키지의 프로젝트에 패키지 참조를 추가합니다.Add a package reference to the project for the Microsoft.Extensions.FileProviders.Embedded package.

포함된 파일의 매니페스트를 생성하려면 <GenerateEmbeddedFilesManifest> 속성을 true로 설정합니다.To generate a manifest of the embedded files, set the <GenerateEmbeddedFilesManifest> property to true. <EmbeddedResource>를 사용하여 포함할 파일을 지정합니다.Specify the files to embed with <EmbeddedResource>:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="3.1.0" />
  </ItemGroup>

  <ItemGroup>
    <EmbeddedResource Include="Resource.txt" />
  </ItemGroup>

</Project>

GLOB 패턴을 사용하여 어셈블리에 포함할 파일을 하나 이상 지정합니다.Use glob patterns to specify one or more files to embed into the assembly.

샘플 앱은 ManifestEmbeddedFileProvider를 생성하고 현재 실행 중인 어셈블리를 생성자에 전달합니다.The sample app creates an ManifestEmbeddedFileProvider and passes the currently executing assembly to its constructor.

Startup.cs:Startup.cs:

var manifestEmbeddedProvider = 
    new ManifestEmbeddedFileProvider(typeof(Program).Assembly);

추가 오버로드를 사용하면 다음을 수행할 수 있습니다.Additional overloads allow you to:

  • 상대 파일 경로 지정Specify a relative file path.
  • 마지막으로 수정한 날짜로 파일의 범위 지정Scope files to a last modified date.
  • 포함된 파일 매니페스트를 포함하는 포함 리소스의 이름 지정Name the embedded resource containing the embedded file manifest.
오버로드Overload 설명Description
ManifestEmbeddedFileProvider(Assembly, String) 선택적인 root 상대 경로 매개 변수를 허용합니다.Accepts an optional root relative path parameter. root를 지정하여 GetDirectoryContents에 대한 호출의 범위를 제공된 경로의 해당 리소스로 지정합니다.Specify the root to scope calls to GetDirectoryContents to those resources under the provided path.
ManifestEmbeddedFileProvider(Assembly, String, DateTimeOffset) 선택적인 root 상대 경로 매개 변수 및 lastModified 날짜(DateTimeOffset) 매개 변수를 허용합니다.Accepts an optional root relative path parameter and a lastModified date (DateTimeOffset) parameter. lastModified 날짜는 IFileProvider가 반환한 IFileInfo 인스턴스에 대한 마지막 수정 날짜의 범위를 지정합니다.The lastModified date scopes the last modification date for the IFileInfo instances returned by the IFileProvider.
ManifestEmbeddedFileProvider(Assembly, String, String, DateTimeOffset) 선택적인 root 상대 경로, lastModified 날짜 및 manifestName 매개 변수를 허용합니다.Accepts an optional root relative path, lastModified date, and manifestName parameters. manifestName은 매니페스트가 포함된 포함 리소스의 이름을 나타냅니다.The manifestName represents the name of the embedded resource containing the manifest.

CompositeFileProviderCompositeFileProvider

CompositeFileProviderIFileProvider 의 인스턴스들을 결합해서 다수의 공급자를 이용한 파일 작업을 처리할 수 있는 단일 인터페이스를 제공합니다. The CompositeFileProvider combines IFileProvider instances, exposing a single interface for working with files from multiple providers. CompositeFileProvider를 생성할 때는 생성자에 하나 이상의 IFileProvider 인스턴스를 전달합니다.When creating the CompositeFileProvider, pass one or more IFileProvider instances to its constructor.

샘플 앱에서 PhysicalFileProviderManifestEmbeddedFileProvider는 앱의 서비스 컨테이너에 등록된 CompositeFileProvider에 파일을 제공합니다.In the sample app, a PhysicalFileProvider and a ManifestEmbeddedFileProvider provide files to a CompositeFileProvider registered in the app's service container:

var physicalProvider = _env.ContentRootFileProvider;
var manifestEmbeddedProvider = 
    new ManifestEmbeddedFileProvider(typeof(Program).Assembly);
var compositeProvider = 
    new CompositeFileProvider(physicalProvider, manifestEmbeddedProvider);

services.AddSingleton<IFileProvider>(compositeProvider);

변경 내용 관찰Watch for changes

IFileProvider.Watch 메서드는 하나 이상의 파일 또는 디렉터리의 변경 내용을 관찰하는 시나리오를 제공합니다.The IFileProvider.Watch method provides a scenario to watch one or more files or directories for changes. WatchGLOB 패턴을 사용하여 여러 파일을 지정할 수 있는 경로 문자열을 허용합니다.Watch accepts a path string, which can use glob patterns to specify multiple files. WatchIChangeToken을 반환합니다.Watch returns an IChangeToken. 변경 토큰은 다음을 공개합니다.The change token exposes:

  • HasChanged – 변경이 발생했는지 확인하기 위해 검사할 수 있는 속성입니다.HasChanged – A property that can be inspected to determine if a change has occurred.
  • RegisterChangeCallback – 지정한 경로 문자열에 대한 변경 내용이 검색되면 호출됩니다.RegisterChangeCallback – Called when changes are detected to the specified path string. 각 변경 토큰은 단일 변경에 대한 응답으로 자신과 연결된 콜백만 호출합니다.Each change token only calls its associated callback in response to a single change. 모니터링을 지속적으로 수행하기 위해서는 다음 예처럼 TaskCompletionSource<TResult>를 사용하거나 변경 사항에 대한 응답에서 IChangeToken 인스턴스를 다시 생성합니다.To enable constant monitoring, use a TaskCompletionSource<TResult> (shown below) or recreate IChangeToken instances in response to changes.

샘플 앱에서 WatchConsole 콘솔 앱은 텍스트 파일이 수정될 때마다 메시지를 표시하도록 구성됩니다.In the sample app, the WatchConsole console app is configured to display a message whenever a text file is modified:

private static PhysicalFileProvider _fileProvider = 
    new PhysicalFileProvider(Directory.GetCurrentDirectory());

public static void Main(string[] args)
{
    Console.WriteLine("Monitoring quotes.txt for changes (Ctrl-c to quit)...");

    while (true)
    {
        MainAsync().GetAwaiter().GetResult();
    }
}

private static async Task MainAsync()
{
    IChangeToken token = _fileProvider.Watch("quotes.txt");
    var tcs = new TaskCompletionSource<object>();

    token.RegisterChangeCallback(state => 
        ((TaskCompletionSource<object>)state).TrySetResult(null), tcs);

    await tcs.Task.ConfigureAwait(false);

    Console.WriteLine("quotes.txt changed");
}

Docker 컨테이너나 네트워크 공유 같은 일부 파일 시스템은 변경 알림을 안정적으로 전송할 수 없습니다.Some file systems, such as Docker containers and network shares, may not reliably send change notifications. DOTNET_USE_POLLING_FILE_WATCHER 환경 변수를 1 또는 true로 설정하여 변경에 대해 파일 시스템을 4초마다 폴링합니다(구성할 수 없음).Set the DOTNET_USE_POLLING_FILE_WATCHER environment variable to 1 or true to poll the file system for changes every four seconds (not configurable).

GLOB 패턴Glob patterns

파일 시스템 경로는 GLOB(또는 와일드카드 사용) 패턴이라고 부르는 와일드카드 패턴을 사용합니다.File system paths use wildcard patterns called glob (or globbing) patterns. 이러한 패턴을 사용하여 파일 그룹을 지정합니다.Specify groups of files with these patterns. 두 개의 와일드카드 문자는 ***입니다.The two wildcard characters are * and **:

*
현재 폴더 수준의 모든 항목, 모든 파일명 또는 모든 파일 확장자를 찾습니다.Matches anything at the current folder level, any filename, or any file extension. 파일 경로의 /. 문자에 의해서 일치가 중단됩니다.Matches are terminated by / and . characters in the file path.

**
여러 디렉터리 수준에서 모든 것을 일치시킵니다.Matches anything across multiple directory levels. 디렉터리 계층 구조 내의 여러 파일과 일치시키는 데 재귀적으로 사용될 수 있습니다.Can be used to recursively match many files within a directory hierarchy.

GLOB 패턴 예제Glob pattern examples

directory/file.txt
특정 디렉터리에 있는 특정 파일을 일치시킵니다.Matches a specific file in a specific directory.

directory/*.txt
특정 디렉터리에서 확장명이 .txt인 파일을 모두 찾습니다.Matches all files with .txt extension in a specific directory.

directory/*/appsettings.json
directory 폴더보다 정확히 한 수준 아래의 디렉터리에서 모든 appsettings.json 파일을 찾습니다.Matches all appsettings.json files in directories exactly one level below the directory folder.

directory/**/*.txt
directory 폴더 아래의 모든 곳에서 찾은 확장명이 .txt인 파일을 모두 찾습니다.Matches all files with .txt extension found anywhere under the directory folder.

ASP.NET Core에서 파일 공급자를 사용하여 파일 시스템 액세스를 추상화합니다.ASP.NET Core abstracts file system access through the use of File Providers. 파일 공급자는 ASP.NET Core 프레임워크 전체에서 사용됩니다.File Providers are used throughout the ASP.NET Core framework:

예제 코드 살펴보기 및 다운로드 (다운로드 방법)View or download sample code (how to download)

파일 공급자 인터페이스File Provider interfaces

기본 인터페이스는 IFileProvider입니다.The primary interface is IFileProvider. IFileProvider는 다음을 수행하는 메서드를 노출합니다.IFileProvider exposes methods to:

IFileInfo는 파일 작업에 대한 메서드 및 속성을 제공합니다.IFileInfo provides methods and properties for working with files:

IFileInfo.CreateReadStream 메서드를 사용하여 파일에서 읽을 수 있습니다.You can read from the file using the IFileInfo.CreateReadStream method.

샘플 앱은 종속성 주입을 통해 앱 전체에서 사용하기 위해 Startup.ConfigureServices에 파일 공급자를 구성하는 방법을 보여 줍니다.The sample app demonstrates how to configure a File Provider in Startup.ConfigureServices for use throughout the app via dependency injection.

파일 공급자 구현File Provider implementations

IFileProvider의 세 가지 구현을 사용할 수 있습니다.Three implementations of IFileProvider are available.

구현Implementation 설명Description
PhysicalFileProviderPhysicalFileProvider 물리적 공급자는 시스템의 물리적 파일에 액세스하기 위해서 사용됩니다.The physical provider is used to access the system's physical files.
ManifestEmbeddedFileProviderManifestEmbeddedFileProvider 매니페스트 임베디드 공급자는 어셈블리에 포함된 파일에 액세스하기 위해서 사용됩니다.The manifest embedded provider is used to access files embedded in assemblies.
CompositeFileProviderCompositeFileProvider 마지막으로 복합 공급자는 하나 이상의 개별 공급자로부터 얻어진 파일 및 디렉터리에 대한 복합적인 접근을 지원하기 위해서 사용됩니다.The composite provider is used to provide combined access to files and directories from one or more other providers.

PhysicalFileProviderPhysicalFileProvider

PhysicalFileProvider 는 실제 파일 시스템에 대한 접근을 제공합니다.The PhysicalFileProvider provides access to the physical file system. PhysicalFileProviderSystem.IO.File 형식(물리적 공급자에 대해)을 사용하고 디렉터리와 그 하위 자식에 대한 모든 경로의 범위를 지정합니다.PhysicalFileProvider uses the System.IO.File type (for the physical provider) and scopes all paths to a directory and its children. 이 범위 지정은 지정된 디렉터리와 그 하위 자식 이외의 파일 시스템에 대한 액세스를 방지합니다.This scoping prevents access to the file system outside of the specified directory and its children. 가장 공통적인 PhysicalFileProvider 생성 및 사용 시나리오는 종속성 주입을 통해 생성자 내에 IFileProvider를 요청하는 것입니다.The most common scenario for creating and using a PhysicalFileProvider is to request an IFileProvider in a constructor through dependency injection.

이 공급자를 직접 인스턴스화하는 경우 디렉터리 경로가 필요하며, 공급자를 사용하여 수행한 모든 요청에 대한 기본 경로로 사용됩니다.When instantiating this provider directly, a directory path is required and serves as the base path for all requests made using the provider.

다음 코드는 PhysicalFileProvider를 생성하고 이를 사용하여 디렉터리 콘텐츠 및 파일 정보를 가져오는 방법을 보여 줍니다.The following code shows how to create a PhysicalFileProvider and use it to obtain directory contents and file information:

var provider = new PhysicalFileProvider(applicationRoot);
var contents = provider.GetDirectoryContents(string.Empty);
var fileInfo = provider.GetFileInfo("wwwroot/js/site.js");

이전 예제의 형식:Types in the preceding example:

  • providerIFileProvider입니다.provider is an IFileProvider.
  • contentsIDirectoryContents입니다.contents is an IDirectoryContents.
  • fileInfoIFileInfo입니다.fileInfo is an IFileInfo.

파일 공급자는 applicationRoot로 지정된 디렉터리를 반복하거나 GetFileInfo를 호출하여 파일 정보를 가져오는 데 사용될 수 있습니다.The File Provider can be used to iterate through the directory specified by applicationRoot or call GetFileInfo to obtain a file's information. 파일 공급자는 applicationRoot 디렉터리 외에는 액세스 권한이 없습니다.The File Provider has no access outside of the applicationRoot directory.

샘플 앱은 IHostingEnvironment.ContentRootFileProvider를 사용하여 앱의 Startup.ConfigureServices 클래스에 공급자를 생성합니다.The sample app creates the provider in the app's Startup.ConfigureServices class using IHostingEnvironment.ContentRootFileProvider:

var physicalProvider = _env.ContentRootFileProvider;

ManifestEmbeddedFileProviderManifestEmbeddedFileProvider

ManifestEmbeddedFileProvider는 어셈블리에 포함된 파일에 접근하기 위한 용도로 사용됩니다.The ManifestEmbeddedFileProvider is used to access files embedded within assemblies. ManifestEmbeddedFileProvider는 어셈블리로 컴파일된 매니페스트를 사용하여 포함된 파일의 원래 경로를 재구성합니다.The ManifestEmbeddedFileProvider uses a manifest compiled into the assembly to reconstruct the original paths of the embedded files.

포함된 파일의 매니페스트를 생성하려면 <GenerateEmbeddedFilesManifest> 속성을 true로 설정합니다.To generate a manifest of the embedded files, set the <GenerateEmbeddedFilesManifest> property to true. <EmbeddedResource>를 사용하여 포함할 파일을 지정합니다.Specify the files to embed with <EmbeddedResource>:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.2</TargetFramework>
    <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
    <GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App" />
  </ItemGroup>

  <ItemGroup>
    <EmbeddedResource Include="Resource.txt" />
  </ItemGroup>

</Project>

GLOB 패턴을 사용하여 어셈블리에 포함할 파일을 하나 이상 지정합니다.Use glob patterns to specify one or more files to embed into the assembly.

샘플 앱은 ManifestEmbeddedFileProvider를 생성하고 현재 실행 중인 어셈블리를 생성자에 전달합니다.The sample app creates an ManifestEmbeddedFileProvider and passes the currently executing assembly to its constructor.

Startup.cs:Startup.cs:

var manifestEmbeddedProvider = 
    new ManifestEmbeddedFileProvider(typeof(Program).Assembly);

추가 오버로드를 사용하면 다음을 수행할 수 있습니다.Additional overloads allow you to:

  • 상대 파일 경로 지정Specify a relative file path.
  • 마지막으로 수정한 날짜로 파일의 범위 지정Scope files to a last modified date.
  • 포함된 파일 매니페스트를 포함하는 포함 리소스의 이름 지정Name the embedded resource containing the embedded file manifest.
오버로드Overload 설명Description
ManifestEmbeddedFileProvider(Assembly, String) 선택적인 root 상대 경로 매개 변수를 허용합니다.Accepts an optional root relative path parameter. root를 지정하여 GetDirectoryContents에 대한 호출의 범위를 제공된 경로의 해당 리소스로 지정합니다.Specify the root to scope calls to GetDirectoryContents to those resources under the provided path.
ManifestEmbeddedFileProvider(Assembly, String, DateTimeOffset) 선택적인 root 상대 경로 매개 변수 및 lastModified 날짜(DateTimeOffset) 매개 변수를 허용합니다.Accepts an optional root relative path parameter and a lastModified date (DateTimeOffset) parameter. lastModified 날짜는 IFileProvider가 반환한 IFileInfo 인스턴스에 대한 마지막 수정 날짜의 범위를 지정합니다.The lastModified date scopes the last modification date for the IFileInfo instances returned by the IFileProvider.
ManifestEmbeddedFileProvider(Assembly, String, String, DateTimeOffset) 선택적인 root 상대 경로, lastModified 날짜 및 manifestName 매개 변수를 허용합니다.Accepts an optional root relative path, lastModified date, and manifestName parameters. manifestName은 매니페스트가 포함된 포함 리소스의 이름을 나타냅니다.The manifestName represents the name of the embedded resource containing the manifest.

CompositeFileProviderCompositeFileProvider

CompositeFileProviderIFileProvider 의 인스턴스들을 결합해서 다수의 공급자를 이용한 파일 작업을 처리할 수 있는 단일 인터페이스를 제공합니다. The CompositeFileProvider combines IFileProvider instances, exposing a single interface for working with files from multiple providers. CompositeFileProvider를 생성할 때는 생성자에 하나 이상의 IFileProvider 인스턴스를 전달합니다.When creating the CompositeFileProvider, pass one or more IFileProvider instances to its constructor.

샘플 앱에서 PhysicalFileProviderManifestEmbeddedFileProvider는 앱의 서비스 컨테이너에 등록된 CompositeFileProvider에 파일을 제공합니다.In the sample app, a PhysicalFileProvider and a ManifestEmbeddedFileProvider provide files to a CompositeFileProvider registered in the app's service container:

var physicalProvider = _env.ContentRootFileProvider;
var manifestEmbeddedProvider = 
    new ManifestEmbeddedFileProvider(typeof(Program).Assembly);
var compositeProvider = 
    new CompositeFileProvider(physicalProvider, manifestEmbeddedProvider);

services.AddSingleton<IFileProvider>(compositeProvider);

변경 내용 관찰Watch for changes

IFileProvider.Watch 메서드는 하나 이상의 파일 또는 디렉터리의 변경 내용을 관찰하는 시나리오를 제공합니다.The IFileProvider.Watch method provides a scenario to watch one or more files or directories for changes. WatchGLOB 패턴을 사용하여 여러 파일을 지정할 수 있는 경로 문자열을 허용합니다.Watch accepts a path string, which can use glob patterns to specify multiple files. WatchIChangeToken을 반환합니다.Watch returns an IChangeToken. 변경 토큰은 다음을 공개합니다.The change token exposes:

  • HasChanged – 변경이 발생했는지 확인하기 위해 검사할 수 있는 속성입니다.HasChanged – A property that can be inspected to determine if a change has occurred.
  • RegisterChangeCallback – 지정한 경로 문자열에 대한 변경 내용이 검색되면 호출됩니다.RegisterChangeCallback – Called when changes are detected to the specified path string. 각 변경 토큰은 단일 변경에 대한 응답으로 자신과 연결된 콜백만 호출합니다.Each change token only calls its associated callback in response to a single change. 모니터링을 지속적으로 수행하기 위해서는 다음 예처럼 TaskCompletionSource<TResult>를 사용하거나 변경 사항에 대한 응답에서 IChangeToken 인스턴스를 다시 생성합니다.To enable constant monitoring, use a TaskCompletionSource<TResult> (shown below) or recreate IChangeToken instances in response to changes.

샘플 앱에서 WatchConsole 콘솔 앱은 텍스트 파일이 수정될 때마다 메시지를 표시하도록 구성됩니다.In the sample app, the WatchConsole console app is configured to display a message whenever a text file is modified:

private static PhysicalFileProvider _fileProvider = 
    new PhysicalFileProvider(Directory.GetCurrentDirectory());

public static void Main(string[] args)
{
    Console.WriteLine("Monitoring quotes.txt for changes (Ctrl-c to quit)...");

    while (true)
    {
        MainAsync().GetAwaiter().GetResult();
    }
}

private static async Task MainAsync()
{
    IChangeToken token = _fileProvider.Watch("quotes.txt");
    var tcs = new TaskCompletionSource<object>();

    token.RegisterChangeCallback(state => 
        ((TaskCompletionSource<object>)state).TrySetResult(null), tcs);

    await tcs.Task.ConfigureAwait(false);

    Console.WriteLine("quotes.txt changed");
}

Docker 컨테이너나 네트워크 공유 같은 일부 파일 시스템은 변경 알림을 안정적으로 전송할 수 없습니다.Some file systems, such as Docker containers and network shares, may not reliably send change notifications. DOTNET_USE_POLLING_FILE_WATCHER 환경 변수를 1 또는 true로 설정하여 변경에 대해 파일 시스템을 4초마다 폴링합니다(구성할 수 없음).Set the DOTNET_USE_POLLING_FILE_WATCHER environment variable to 1 or true to poll the file system for changes every four seconds (not configurable).

GLOB 패턴Glob patterns

파일 시스템 경로는 GLOB(또는 와일드카드 사용) 패턴이라고 부르는 와일드카드 패턴을 사용합니다.File system paths use wildcard patterns called glob (or globbing) patterns. 이러한 패턴을 사용하여 파일 그룹을 지정합니다.Specify groups of files with these patterns. 두 개의 와일드카드 문자는 ***입니다.The two wildcard characters are * and **:

*
현재 폴더 수준의 모든 항목, 모든 파일명 또는 모든 파일 확장자를 찾습니다.Matches anything at the current folder level, any filename, or any file extension. 파일 경로의 /. 문자에 의해서 일치가 중단됩니다.Matches are terminated by / and . characters in the file path.

**
여러 디렉터리 수준에서 모든 것을 일치시킵니다.Matches anything across multiple directory levels. 디렉터리 계층 구조 내의 여러 파일과 일치시키는 데 재귀적으로 사용될 수 있습니다.Can be used to recursively match many files within a directory hierarchy.

GLOB 패턴 예제Glob pattern examples

directory/file.txt
특정 디렉터리에 있는 특정 파일을 일치시킵니다.Matches a specific file in a specific directory.

directory/*.txt
특정 디렉터리에서 확장명이 .txt인 파일을 모두 찾습니다.Matches all files with .txt extension in a specific directory.

directory/*/appsettings.json
directory 폴더보다 정확히 한 수준 아래의 디렉터리에서 모든 appsettings.json 파일을 찾습니다.Matches all appsettings.json files in directories exactly one level below the directory folder.

directory/**/*.txt
directory 폴더 아래의 모든 곳에서 찾은 확장명이 .txt인 파일을 모두 찾습니다.Matches all files with .txt extension found anywhere under the directory folder.