解决MySql布尔型新旧版本兼容问题,采用枚举来表示布尔型的数据表。由正向工程赋值
|
# ·¾¶À©Õ¹ 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)
|