v9.10.2019.0101  全面巩固批量Insert/Update/Upsert,支持数据备份、恢复和同步,支持实体列表保存到文件以及加载
大石头 authored at 2019-01-01 13:38:33
11.07 KiB
X
# ·¾¶À©Õ¹ PathHelper ## ¸ÅÊö `PathHelper` ÊÇ NewLife.Core ÖеÄ·¾¶²Ù×÷¹¤¾ßÀ࣬Ìṩ¿çƽ̨µÄÎļþ·¾¶´¦Àí¡¢Ä¿Â¼¹ÜÀí¡¢ÎļþѹËõ½âѹ¡¢¹þϣУÑéµÈ¹¦ÄÜ¡£ÖÇÄÜ´¦ÀíÏà¶Ô·¾¶ºÍ¾ø¶Ô·¾¶£¬×Ô¶¯ÊÊÅä Windows ºÍ Linux µÄ·¾¶·Ö¸ô·û¡£ **ÃüÃû¿Õ¼ä**£º`System.IO`£¨±ãÓÚÖ±½ÓʹÓã¬ÎÞÐè¶îÍâÒýÓã© **ÎĵµµØÖ·**£ºhttps://newlifex.com/core/path_helper ## ºËÐÄÌØÐÔ - **¿çƽ̨·¾¶´¦Àí**£º×Ô¶¯ÊÊÅä Windows£¨`\`£©ºÍ Linux£¨`/`£©Â·¾¶·Ö¸ô·û - **ÖÇÄÜ·¾¶½âÎö**£ºÖ§³ÖÏà¶Ô·¾¶¡¢¾ø¶Ô·¾¶¡¢ÍøÂç·¾¶ - **º¯Êý¼ÆËãÖ§³Ö**£ºÍ¨¹ýÃüÁîÐвÎÊý»ò»·¾³±äÁ¿ÅäÖûù´¡Ä¿Â¼ - **ѹËõ½âѹ֧³Ö**£ºÖ§³Ö zip¡¢tar¡¢tar.gz¡¢7z µÈ¸ñʽ - **Îļþ¹þϣУÑé**£ºÖ§³Ö MD5¡¢SHA1¡¢SHA256¡¢SHA512¡¢CRC32 ## ¿ìËÙ¿ªÊ¼ ```csharp using System.IO; // »ñÈ¡ÍêÕû·¾¶ var path = "config/app.json".GetFullPath(); // È·±£Ä¿Â¼´æÔÚ "logs/2024/01/".EnsureDirectory(false); // ºÏ²¢Â·¾¶ var file = "data".CombinePath("users", "config.json"); // ѹËõĿ¼ "output".AsDirectory().Compress("backup.zip"); // ÑéÖ¤Îļþ¹þÏ£ var valid = "app.exe".AsFile().VerifyHash("md5$1234567890abcdef"); ``` ## API ²Î¿¼ ### ·¾¶ÊôÐÔ #### BasePath ```csharp public static String? BasePath { get; set; } ``` »ù´¡Ä¿Â¼£¬ÓÃÓÚ `GetBasePath` ·½·¨¡£Ö÷ÒªÓÃÓÚ X ×é¼þÄÚ²¿¸÷Ŀ¼£¬×¨ÃÅΪº¯Êý¼ÆËã¶ø¶¨ÖÆ¡£ **ÅäÖ÷½Ê½**£¨°´ÓÅÏȼ¶£©£º 1. ÃüÁîÐвÎÊý£º`-BasePath /app/data` »ò `--BasePath /app/data` 2. »·¾³±äÁ¿£º`BasePath=/app/data` 3. ĬÈÏÖµ£ºÓ¦ÓóÌÐòÓò»ù´¡Ä¿Â¼ #### BaseDirectory ```csharp public static String? BaseDirectory { get; set; } ``` »ù׼Ŀ¼£¬ÓÃÓÚ `GetFullPath` ·½·¨¡£Ö§³Öͨ¹ýÃüÁîÐвÎÊýºÍ»·¾³±äÁ¿ÅäÖᣠ### ·¾¶×ª»» #### GetFullPath ```csharp public static String GetFullPath(this String path) ``` »ñÈ¡Îļþ»òĿ¼»ùÓÚÓ¦ÓóÌÐòÓò»ùĿ¼µÄȫ·¾¶¡£ **ÌØµã**£º - ×Ô¶¯´¦ÀíÏà¶Ô·¾¶ - ×Ô¶¯×ª»»Â·¾¶·Ö¸ô·û - Ö§³ÖÍøÂç·¾¶£¨`\\server\share`£© - Ö§³Ö `~` ¿ªÍ·µÄ·¾¶ **ʾÀý**£º ```csharp // Ïà¶Ô·¾¶×ª¾ø¶Ô·¾¶ "config/app.json".GetFullPath() // Windows: C:\MyApp\config\app.json // Linux: /home/user/myapp/config/app.json // ÒÑÊǾø¶Ô·¾¶ÔòÔ­Ñù·µ»Ø "C:\\temp\\file.txt".GetFullPath() // C:\temp\file.txt "/var/log/app.log".GetFullPath() // /var/log/app.log // ÍøÂç·¾¶ "\\\\server\\share\\file.txt".GetFullPath() // \\server\share\file.txt // ~ ¿ªÍ·µÄ·¾¶ "~/config/app.json".GetFullPath() // È¥³ý ~ ºóÆ´½Ó»ù´¡Ä¿Â¼ ``` #### GetBasePath ```csharp public static String GetBasePath(this String path) ``` »ñÈ¡Îļþ»òĿ¼µÄȫ·¾¶£¬ÓÃÓÚ X ×é¼þÄÚ²¿¸÷Ŀ¼¡£ **ʾÀý**£º ```csharp "logs/app.log".GetBasePath() // »ùÓÚ BasePath µÄÍêÕû·¾¶ ``` #### GetCurrentPath ```csharp public static String GetCurrentPath(this String path) ``` »ñÈ¡Îļþ»òĿ¼»ùÓÚµ±Ç°¹¤×÷Ŀ¼µÄȫ·¾¶¡£ **ʾÀý**£º ```csharp "output/result.txt".GetCurrentPath() // »ùÓÚ Environment.CurrentDirectory µÄÍêÕû·¾¶ ``` ### Ŀ¼²Ù×÷ #### EnsureDirectory ```csharp public static String EnsureDirectory(this String path, Boolean isfile = true) ``` È·±£Ä¿Â¼´æÔÚ£¬Èô²»´æÔÚÔò´´½¨¡£ **²ÎÊý˵Ã÷**£º - `isfile`£ºÂ·¾¶ÊÇ·ñΪÎļþ·¾¶¡£`true` ʱȡĿ¼²¿·Ö£»Ð±¸Ü½áβµÄ·¾¶Ê¼ÖÕÊÓΪĿ¼¡£ **ʾÀý**£º ```csharp // È·±£ÎļþËùÔÚĿ¼´æÔÚ "logs/2024/01/app.log".EnsureDirectory(true); // ´´½¨ logs/2024/01/ Ŀ¼ // È·±£Ä¿Â¼±¾Éí´æÔÚ "data/cache/".EnsureDirectory(false); // ´´½¨ data/cache/ Ŀ¼ // б¸Ü½áβµÄ·¾¶Ê¼ÖÕÊÓΪĿ¼ "output/temp/".EnsureDirectory(); // isfile ²ÎÊý±»ºöÂÔ ``` #### CombinePath ```csharp public static String CombinePath(this String? path, params String[] ps) ``` ºÏ²¢¶à¶Î·¾¶¡£ **ʾÀý**£º ```csharp "data".CombinePath("users", "config.json") // Windows: data\users\config.json // Linux: data/users/config.json // Ö§³Ö¿Õ·¾¶ "".CombinePath("logs", "app.log") // logs/app.log ``` ### Îļþ²Ù×÷ #### AsFile ```csharp public static FileInfo AsFile(this String file) ``` ½«Â·¾¶×Ö·û´®×ª»»Îª `FileInfo` ¶ÔÏó¡£ **ʾÀý**£º ```csharp var fi = "config/app.json".AsFile(); if (fi.Exists) { Console.WriteLine($"Îļþ´óС: {fi.Length}"); } ``` #### ReadBytes ```csharp public static Byte[] ReadBytes(this FileInfo file, Int32 offset = 0, Int32 count = -1) ``` ´ÓÎļþ¶ÁÈ¡×Ö½ÚÊý¾Ý¡£ **ʾÀý**£º ```csharp // ¶ÁÈ¡Õû¸öÎļþ var data = "data.bin".AsFile().ReadBytes(); // ¶Áȡָ¶¨·¶Î§ var header = "data.bin".AsFile().ReadBytes(0, 100); // ǰ100×Ö½Ú var tail = "data.bin".AsFile().ReadBytes(1000, 50); // ´Ó1000¿ªÊ¼µÄ50×Ö½Ú ``` #### WriteBytes ```csharp public static FileInfo WriteBytes(this FileInfo file, Byte[] data, Int32 offset = 0) ``` ÏòÎļþдÈë×Ö½ÚÊý¾Ý¡£ **ʾÀý**£º ```csharp var data = new Byte[] { 1, 2, 3, 4, 5 }; "output.bin".AsFile().WriteBytes(data); ``` #### CopyToIfNewer ```csharp public static Boolean CopyToIfNewer(this FileInfo fi, String destFileName) ``` ½öµ±Ô´Îļþ±ÈÄ¿±êÎļþÐÂʱ²Å¸´ÖÆ¡£ **ʾÀý**£º ```csharp var source = "src/app.dll".AsFile(); if (source.CopyToIfNewer("dest/app.dll")) { Console.WriteLine("ÎļþÒѸüÐÂ"); } ``` ### Ŀ¼²Ù×÷ #### AsDirectory ```csharp public static DirectoryInfo AsDirectory(this String dir) ``` ½«Â·¾¶×Ö·û´®×ª»»Îª `DirectoryInfo` ¶ÔÏó¡£ **ʾÀý**£º ```csharp var di = "data/cache".AsDirectory(); if (di.Exists) { Console.WriteLine($"°üº¬ {di.GetFiles().Length} ¸öÎļþ"); } ``` #### GetAllFiles ```csharp public static IEnumerable<FileInfo> GetAllFiles(this DirectoryInfo di, String? exts = null, Boolean allSub = false) ``` »ñȡĿ¼ÄÚËùÓзûºÏÌõ¼þµÄÎļþ£¬Ö§³Ö¶àÀ©Õ¹ÃûÆ¥Åä¡£ **ʾÀý**£º ```csharp var dir = "src".AsDirectory(); // »ñÈ¡ËùÓÐÎļþ var allFiles = dir.GetAllFiles(); // »ñȡָ¶¨À©Õ¹ÃûÎļþ var csharpFiles = dir.GetAllFiles("*.cs"); // ¶àÀ©Õ¹ÃûÆ¥Å䣨·ÖºÅ¡¢ÊúÏß¡¢¶ººÅ·Ö¸ô£© var codeFiles = dir.GetAllFiles("*.cs;*.xaml;*.json"); // °üº¬×ÓĿ¼ var allCsharp = dir.GetAllFiles("*.cs", true); ``` #### CopyTo ```csharp public static String[] CopyTo(this DirectoryInfo di, String destDirName, String? exts = null, Boolean allSub = false, Action<String>? callback = null) ``` ¸´ÖÆÄ¿Â¼ÖеÄÎļþµ½Ä¿±êĿ¼¡£ **ʾÀý**£º ```csharp var copied = "src".AsDirectory().CopyTo("backup", "*.cs;*.json", true, name => { Console.WriteLine($"¸´ÖÆ: {name}"); }); Console.WriteLine($"¹²¸´ÖÆ {copied.Length} ¸öÎļþ"); ``` #### CopyToIfNewer ```csharp public static String[] CopyToIfNewer(this DirectoryInfo di, String destDirName, String? exts = null, Boolean allSub = false, Action<String>? callback = null) ``` ½ö¸´ÖÆÔ´Ä¿Â¼ÖбÈÄ¿±êĿ¼¸üеÄÎļþ¡£ **ʾÀý**£º ```csharp var updated = "src".AsDirectory().CopyToIfNewer("dest", "*.dll;*.exe", true); ``` ### ѹËõ½âѹ #### Extract£¨Îļþ½âѹ£© ```csharp public static void Extract(this FileInfo fi, String destDir, Boolean overwrite = false) ``` ½âѹÎļþµ½Ö¸¶¨Ä¿Â¼¡£ **Ö§³Ö¸ñʽ**£ºzip¡¢tar¡¢tar.gz¡¢tgz¡¢7z£¨½ö Windows£© **ʾÀý**£º ```csharp // ½âѹ zip Îļþ "package.zip".AsFile().Extract("output"); // ½âѹ tar.gz Îļþ "archive.tar.gz".AsFile().Extract("output", overwrite: true); // ĬÈϽâѹµ½Í¬ÃûĿ¼ "app.zip".AsFile().Extract(""); // ½âѹµ½ app/ Ŀ¼ ``` #### Compress£¨ÎļþѹËõ£© ```csharp public static void Compress(this FileInfo fi, String destFile) ``` ѹËõµ¥¸öÎļþ¡£ **ʾÀý**£º ```csharp "large-file.log".AsFile().Compress("large-file.zip"); "data.bin".AsFile().Compress("data.tar.gz"); ``` #### Compress£¨Ä¿Â¼Ñ¹Ëõ£© ```csharp public static void Compress(this DirectoryInfo di, String? destFile = null) public static void Compress(this DirectoryInfo di, String? destFile, Boolean includeBaseDirectory) ``` ѹËõÕû¸öĿ¼¡£ **ʾÀý**£º ```csharp // ѹËõĿ¼£¨Ä¬ÈÏ zip ¸ñʽ£© "src".AsDirectory().Compress("src.zip"); // ѹËõΪ tar.gz "dist".AsDirectory().Compress("dist.tar.gz"); // °üº¬¸ùĿ¼Ãû³Æ "project".AsDirectory().Compress("project.zip", true); ``` ### Îļþ¹þϣУÑé #### VerifyHash ```csharp public static Boolean VerifyHash(this FileInfo file, String hash) ``` ÑéÖ¤Îļþ¹þÏ£ÊÇ·ñÆ¥ÅäÔ¤ÆÚÖµ¡£ **Ö§³ÖµÄËã·¨**£º - MD5£¨16λ»ò32룩 - SHA1 - SHA256 - SHA512 - CRC32 **¹þÏ£¸ñʽ**£º - ´øÇ°×º£º`md5$abc123...`¡¢`sha256$def456...`¡¢`crc32$12345678` - ÎÞǰ׺£º¸ù¾Ý³¤¶È×Ô¶¯Ê¶±ð - 8 ×Ö·û£ºCRC32 - 16/32 ×Ö·û£ºMD5 - 40 ×Ö·û£ºSHA1 - 64 ×Ö·û£ºSHA256 - 128 ×Ö·û£ºSHA512 **ʾÀý**£º ```csharp var file = "app.exe".AsFile(); // ´øË㷨ǰ׺ file.VerifyHash("md5$d41d8cd98f00b204e9800998ecf8427e") file.VerifyHash("sha256$e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855") file.VerifyHash("crc32$00000000") // ÎÞǰ׺£¨×Ô¶¯Ê¶±ð£© file.VerifyHash("d41d8cd98f00b204e9800998ecf8427e") // 32λ -> MD5 file.VerifyHash("d41d8cd98f00b204") // 16λ -> MD5£¨Ç°8×Ö½Ú£© file.VerifyHash("12345678") // 8λ -> CRC32 ``` ## ʹÓó¡¾° ### 1. ÅäÖÃÎļþ¹ÜÀí ```csharp public class ConfigManager { public T Load<T>(String configName) where T : new() { var path = $"config/{configName}.json".GetFullPath(); path.EnsureDirectory(true); if (File.Exists(path)) { var json = File.ReadAllText(path); return JsonSerializer.Deserialize<T>(json) ?? new T(); } return new T(); } } ``` ### 2. ÈÕ־Ŀ¼¹ÜÀí ```csharp public class LogManager { public String GetLogPath() { var today = DateTime.Today; var path = $"logs/{today:yyyy}/{today:MM}/{today:dd}/".GetBasePath(); path.EnsureDirectory(false); return path; } } ``` ### 3. Èí¼þ¸üÐÂÓëУÑé ```csharp public class UpdateManager { public async Task<Boolean> UpdateAsync(String url, String expectedHash) { var tempFile = Path.GetTempFileName(); // ÏÂÔØÎļþ await DownloadAsync(url, tempFile); // УÑé¹þÏ£ if (!tempFile.AsFile().VerifyHash(expectedHash)) { File.Delete(tempFile); return false; } // ½âѹ¸üРtempFile.AsFile().Extract("update_temp", overwrite: true); return true; } } ``` ### 4. ÏîÄ¿²¿Êð ```csharp public class Deployer { public void Deploy(String sourceDir, String targetDir) { var source = sourceDir.AsDirectory(); // ¸´ÖÆËùÓиüеÄÎļþ var updated = source.CopyToIfNewer(targetDir, "*.dll;*.exe;*.json", true, name => { Console.WriteLine($"¸üÐÂ: {name}"); }); Console.WriteLine($"¹²¸üР{updated.Length} ¸öÎļþ"); // ѹËõ±¸·Ý targetDir.AsDirectory().Compress($"backup_{DateTime.Now:yyyyMMdd}.zip"); } } ``` ## ×î¼Ñʵ¼ù ### 1. ʼÖÕʹÓà GetFullPath ´¦Àí·¾¶ ```csharp // ÍÆ¼ö£ºÊ¹ÓÃÀ©Õ¹·½·¨»ñÈ¡ÍêÕû·¾¶ var path = "config/app.json".GetFullPath(); // ²»ÍƼö£ºÖ±½ÓʹÓÃÏà¶Ô·¾¶ var path = "config/app.json"; // ¿ÉÄÜÔÚ²»Í¬»·¾³ÏÂÐÐΪ²»Ò»Ö ``` ### 2. ´´½¨Îļþǰȷ±£Ä¿Â¼´æÔÚ ```csharp // ÍÆ¼ö£ºÏÈÈ·±£Ä¿Â¼´æÔÚ var path = "logs/2024/01/app.log".GetFullPath(); path.EnsureDirectory(true); File.WriteAllText(path, content); // ²»ÍƼö£º¿ÉÄÜÅ׳ö DirectoryNotFoundException File.WriteAllText("logs/2024/01/app.log", content); ``` ### 3. ʹÓà AsFile/AsDirectory Á´Ê½²Ù×÷ ```csharp // ¼ò½àµÄÁ´Ê½²Ù×÷ var size = "data.bin".AsFile().ReadBytes().Length; var files = "src".AsDirectory().GetAllFiles("*.cs", true).Count(); ``` ## ƽ̨²îÒì | ¹¦ÄÜ | Windows | Linux | |------|---------|-------| | ·¾¶·Ö¸ô·û | `\` | `/` | | 7z ѹËõ | ? Ö§³Ö | ? ²»Ö§³Ö | | tar.gz ѹËõ | .NET 7+ Ô­ÉúÖ§³Ö | .NET 7+ Ô­ÉúÖ§³Ö | ## Ïà¹ØÁ´½Ó - [Êý¾ÝÀ©Õ¹ IOHelper](/NewLife/X/Blob/dev/Doc/io_helper-Êý¾ÝÀ©Õ¹IOHelper.md) - [ѹËõ½âѹËõ](/NewLife/X/Blob/dev/Doc/compression-ѹËõ½âѹËõ.md) - [°²È«À©Õ¹ SecurityHelper](/NewLife/X/Blob/dev/Doc/security_helper-°²È«À©Õ¹SecurityHelper.md)