You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
163 lines
5.3 KiB
C#
163 lines
5.3 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Text;
|
|
|
|
namespace GeoSigmaDrawLib
|
|
{
|
|
|
|
/// <summary>
|
|
/// 文件操作功能类
|
|
/// </summary>
|
|
public class FileUtility
|
|
{
|
|
public const string TempPath = @".\temp\";
|
|
/// <summary>
|
|
/// 文件编码
|
|
/// </summary>
|
|
/// <param name="inputPath">输入文件</param>
|
|
/// <param name="outputPath">输出文件</param>
|
|
/// <returns>是否成功</returns>
|
|
public static bool EncodeFile(string inputPath, string outputPath)
|
|
{
|
|
bool ret = false;
|
|
ret = File.Exists(inputPath);
|
|
//文本不存在
|
|
if (!ret)
|
|
{
|
|
return false;
|
|
}
|
|
//输入与输出文件相同
|
|
if (inputPath == outputPath)
|
|
{
|
|
return false;
|
|
}
|
|
//文本不是文本文件
|
|
ret = IsTextFile(inputPath);
|
|
string dstPath = Path.GetDirectoryName(outputPath);
|
|
if (!Directory.Exists(dstPath))
|
|
{
|
|
Directory.CreateDirectory(dstPath);
|
|
}
|
|
if (!ret)
|
|
{
|
|
File.Copy(inputPath, outputPath);
|
|
return true;
|
|
}
|
|
|
|
ret = GeoSigmaLib.EncodeFile(inputPath, outputPath);
|
|
return ret;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 解码文件,返回解码临时文件
|
|
/// </summary>
|
|
/// <param name="inputPath">输入文件</param>
|
|
/// <param name="outputPath">输出文件</param>
|
|
/// <returns>是否成功</returns>
|
|
public static bool DecodeFile(string inputPath, out string outputPath)
|
|
{
|
|
bool ret = false;
|
|
ret = File.Exists(inputPath);
|
|
if (!ret)
|
|
{
|
|
outputPath = @"";
|
|
return false;
|
|
}
|
|
|
|
string extention = Path.GetExtension(inputPath);
|
|
if (!Directory.Exists(TempPath))
|
|
{
|
|
Directory.CreateDirectory(TempPath);
|
|
}
|
|
Guid guid = Guid.NewGuid();
|
|
outputPath = Path.Combine(TempPath + guid.ToString() + extention);
|
|
//输入与输出文件相同
|
|
if (inputPath == outputPath)
|
|
{
|
|
return false;
|
|
}
|
|
//文本是文本文件
|
|
ret = IsTextFile(inputPath);
|
|
if (ret)
|
|
{
|
|
File.Copy(inputPath, outputPath);
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
ret = GeoSigmaLib.DecodeFile(inputPath, outputPath);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Determines whether [is text file] [the specified file path].
|
|
/// </summary>
|
|
/// <param name="filePath">The file path.</param>
|
|
/// <returns>
|
|
/// <c>true</c> if [is text file] [the specified file path]; otherwise, <c>false</c>.
|
|
/// </returns>
|
|
public static bool IsTextFile(string filePath)
|
|
{
|
|
if (!File.Exists(filePath))
|
|
{
|
|
return false;
|
|
}
|
|
bool isBinary = false;
|
|
try
|
|
{
|
|
using (BinaryReader br = new BinaryReader(
|
|
File.Open(filePath, FileMode.Open, FileAccess.ReadWrite)
|
|
, Encoding.Default))
|
|
{
|
|
byte[] buffer = br.ReadBytes(512);
|
|
int nLength = buffer.Length;
|
|
if (nLength > 0)
|
|
{
|
|
for(int i = 0; i < nLength; i++)
|
|
{
|
|
if (buffer[i] <= 8 || buffer[i] == 11 || buffer[i] == 12 || buffer[i] == 14 || buffer[i] == 15)
|
|
{
|
|
isBinary = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//byte[] buffer = new byte[4096]; // 定义一个缓冲区来读取文件内容
|
|
|
|
//using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
|
|
//{
|
|
// int bytesRead = fileStream.Read(buffer, 0, buffer.Length); // 读取一部分文件内容到缓冲区
|
|
|
|
// // 检查文件内容是否是二进制数据
|
|
// for (int i = 0; i < bytesRead; i++)
|
|
// {
|
|
// if (buffer[i] == 0)
|
|
// {
|
|
// return false; // 文件含有空字符,认为是二进制文件
|
|
// }
|
|
// else if (buffer[i] < 8 || (buffer[i] > 13 && buffer[i] < 32))
|
|
// {
|
|
// return false; // 文件包含非打印字符,认为是二进制文件
|
|
// }
|
|
// }
|
|
|
|
// // 如果读取的文件内容为空,则认为是二进制文件
|
|
// if (bytesRead == 0)
|
|
// {
|
|
// return false;
|
|
// }
|
|
//}
|
|
|
|
//isBinary = true;
|
|
}
|
|
catch (IOException)
|
|
{
|
|
return true; // 文件访问异常,认为是二进制文件
|
|
}
|
|
return !isBinary;
|
|
}
|
|
}
|
|
}
|