using System;
using System.IO;
using UnityEngine;
public class FileReaderAndWriter : MonoSingleton<FileReaderAndWriter>
{
/// <summary>
/// 以二进制的方式保存文件
/// </summary>
/// <param name="filename">文件名,包含文件路径</param>
/// <param name="content">二进制数据</param>
/// <param name="append">追加?创建/覆盖</param>
/// <param name="successCallback">保存成功事件</param>
/// <param name="errorCallback">保存失败事件</param>
public void SaveBinaryFile(string filename, byte[] content, bool append = false, Action successCallback = null, Action<Exception> errorCallback = null)
{
try
{
// 确保文件路径存在
string directory = Path.GetDirectoryName(filename);
if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
// 写入二进制文件内容(末尾追加,创建/覆盖)
using (FileStream fs = new FileStream(filename, append ? FileMode.Append : FileMode.Create, FileAccess.Write))
{
fs.Write(content, 0, content.Length);
}
// 检查文件是否存在
if (File.Exists(filename))
{
Debug.Log("文件已保存:" + filename);
successCallback?.Invoke(); // 调用成功回调函数
}
else
{
Debug.Log("文件保存失败:" + filename);
errorCallback?.Invoke(new Exception("文件保存失败")); // 调用失败回调函数
}
}
catch (Exception ex)
{
Debug.Log("文件保存失败:" + filename + ", 错误信息: " + ex.Message);
errorCallback?.Invoke(ex); // 调用失败回调函数
}
}
/// <summary>
/// 以二进制的方式读取文件
/// </summary>
/// <param name="filePath">文件路径,包括文件名</param>
/// <param name="onSuccess">读取成功事件</param>
/// <param name="onFailure">读取失败事件</param>
public void ReadBinaryFile(string filePath, Action<byte[]> onSuccess, Action<string> onFailure)
{
try
{
// 使用FileStream打开文件
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
// 创建BinaryReader实例
using (BinaryReader reader = new BinaryReader(fs))
{
// 读取整个文件的字节数组
byte[] fileData = reader.ReadBytes((int)fs.Length);
// 根据需要解析字节数组
// 这里仅打印字节数组作为示例
Debug.Log("File data (bytes):");
foreach (byte b in fileData)
{
Debug.Log(b);
}
// 调用成功回调方法
onSuccess?.Invoke(fileData);
}
}
}
catch (Exception ex)
{
Debug.LogError("Error reading file: " + ex.Message);
// 调用失败回调方法
onFailure?.Invoke(ex.Message);
}
}
}
在给定的代码中,FileReaderAndWriter
类提供了两个主要方法:SaveBinaryFile
和 ReadBinaryFile
,分别用于以二进制方式保存和读取文件。下面是对这两个方法的详细解释,以及如何使用它们。
SaveBinaryFile 方法
SaveBinaryFile
方法用于将二进制数据保存到指定的文件中。该方法的签名如下:
public void SaveBinaryFile(string filename, byte[] content, bool append = false, Action successCallback = null, Action<Exception> errorCallback = null)
-
参数:
filename
: 文件名,包含文件路径。content
: 要保存的二进制数据。append
: 是否追加到文件末尾。如果为false
,则创建或覆盖文件。successCallback
: 保存成功时调用的回调函数。errorCallback
: 保存失败时调用的回调函数。
-
实现细节:
- 确保文件路径存在: 使用
Path.GetDirectoryName
获取文件路径,并检查该路径是否存在。如果不存在,则创建该路径。 - 写入二进制文件内容: 使用
FileStream
打开文件,指定打开模式为FileMode.Append
或FileMode.Create
,以及访问模式为FileAccess.Write
。然后,将二进制数据写入文件。 - 检查文件是否存在: 写入完成后,检查文件是否存在。如果存在,则调用
successCallback
;否则,调用errorCallback
。 - 异常处理: 捕获并处理所有可能的异常,调用
errorCallback
并传递异常信息。
- 确保文件路径存在: 使用
ReadBinaryFile 方法
ReadBinaryFile
方法用于从指定的文件中读取二进制数据。该方法的签名如下:
public void ReadBinaryFile(string filePath, Action<byte[]> onSuccess, Action<string> onFailure)
-
参数:
filePath
: 文件路径,包括文件名。onSuccess
: 读取成功时调用的回调函数,传递读取到的二进制数据。onFailure
: 读取失败时调用的回调函数,传递错误信息。
-
实现细节:
- 打开文件: 使用
FileStream
打开文件,指定打开模式为FileMode.Open
和访问模式为FileAccess.Read
。 - 读取二进制数据: 使用
BinaryReader
从文件中读取二进制数据。 - 关闭资源: 读取完成后,关闭
BinaryReader
和FileStream
。 - 异常处理: 捕获并处理所有可能的异常,调用
onFailure
并传递错误信息。
- 打开文件: 使用
使用示例
以下是如何使用 FileReaderAndWriter
类中的两个方法的示例:
using System;
using UnityEngine;
public class ExampleUsage : MonoBehaviour
{
private void Start()
{
// 创建 FileReaderAndWriter 实例
FileReaderAndWriter fileReaderAndWriter = FileReaderAndWriter.Instance;
// 要保存的二进制数据
byte[] dataToSave = new byte[] { 1, 2, 3, 4, 5 };
// 保存文件
fileReaderAndWriter.SaveBinaryFile("Assets/Example.bin", dataToSave, false,
() => Debug.Log("文件保存成功"),
(ex) => Debug.LogError("文件保存失败: " + ex.Message));
// 读取文件
fileReaderAndWriter.ReadBinaryFile("Assets/Example.bin",
(data) =>
{
Debug.Log("文件读取成功");
foreach (byte b in data)
{
Debug.Log(b);
}
},
(error) => Debug.LogError("文件读取失败: " + error));
}
}