1. 程式人生 > 實用技巧 >(精華)2020年9月15日 ASP.NET Core 檔案系統詳解

(精華)2020年9月15日 ASP.NET Core 檔案系統詳解

(精華)2020年9月15日 ASP.NET Core 檔案系統詳解

1.檔案系統遍歷檔案目錄

public static class Sample01
{<!-- -->
    public static void Run()
    {<!-- -->
        var provider = new ServiceCollection()
            .AddSingleton<IFileProvider>(new PhysicalFileProvider(@"e:\測試資料夾"))
            .AddSingleton<FileManager>()
            .BuildServiceProvider();
        var fileManager = provider.GetService<FileManager>();
        fileManager.Dir();
    }

    public class FileManager
    {<!-- -->
        private readonly IFileProvider _fileProvider;
        public FileManager(IFileProvider fileProvider)
        {<!-- -->
            _fileProvider = fileProvider;
        }

        public void Dir()
        {<!-- -->
            var indent = -1;

            void Get(string subpath)
            {<!-- -->
                indent++;
                foreach (var fileinfo in _fileProvider.GetDirectoryContents(subpath))
                {<!-- -->
                    Console.WriteLine(new string('\t',indent) + fileinfo.Name);
                    if (fileinfo.IsDirectory)
                    {<!-- -->
                        Get($@"{subpath}\{fileinfo.Name}");
                    }
                }
            }
            Get("");
        }
    }
}

2.程式內嵌檔案讀取檔案資訊

public static class Sample02
{<!-- -->
    public static void Run()
    {<!-- -->
        var provider = new ServiceCollection()
            .AddSingleton<IFileProvider>(new EmbeddedFileProvider(Assembly.GetExecutingAssembly()))
            .AddSingleton<FileManager>()
            .BuildServiceProvider();
        var fileManager = provider.GetService<FileManager>();
        var content = fileManager.ReadAsync("Text.txt").Result;
        Console.WriteLine(content);
    }

    public class FileManager
    {<!-- -->
        private readonly IFileProvider _fileProvider;
        public FileManager(IFileProvider fileProvider)
        {<!-- -->
            _fileProvider = fileProvider;
        }

        public async Task<string> ReadAsync(string path)
        {<!-- -->
            await using var stream = _fileProvider.GetFileInfo(path).CreateReadStream();
            var buffer = new byte[stream.Length];
            await stream.ReadAsync(buffer, 0, buffer.Length);
            return Encoding.Default.GetString(buffer);
        }

    }
}

3.監控檔案系統,檔案發生改變實時通知程式

public static class Sample03
{<!-- -->
    public static void Run()
    {<!-- -->
        var provider = new ServiceCollection()
            .AddSingleton<IFileProvider>(new PhysicalFileProvider(@"e:\其它"))
            .AddSingleton<FileManager>()
            .BuildServiceProvider();
        var fileManager = provider.GetService<FileManager>();
        fileManager.WatchAsync("Text.txt").Wait();
        Console.Read();
    }

    public class FileManager
    {<!-- -->
        private readonly IFileProvider _fileProvider;
        public FileManager(IFileProvider fileProvider)
        {<!-- -->
            _fileProvider = fileProvider;
        }

        public async Task WatchAsync(string path)
        {<!-- -->
            Console.WriteLine(await ReadAsync(path));

            ChangeToken.OnChange(() => _fileProvider.Watch(path), async () =>
            {<!-- -->
                Console.Clear();
                Console.WriteLine(await ReadAsync(path));
            });
        }

        public async Task<string> ReadAsync(string path)
        {<!-- -->
            await using var stream = _fileProvider.GetFileInfo(path).CreateReadStream();
            var buffer = new byte[stream.Length];
            await stream.ReadAsync(buffer, 0, buffer.Length);
            return Encoding.Default.GetString(buffer);
        }
    }
}