311 lines
11 KiB
C#
311 lines
11 KiB
C#
|
|
using System;
|
|||
|
|
using System.Diagnostics;
|
|||
|
|
using UnityEngine;
|
|||
|
|
using System.IO;
|
|||
|
|
using System.Linq;
|
|||
|
|
using System.Text;
|
|||
|
|
using System.Threading;
|
|||
|
|
//using UnityEditor.Experimental.TerrainAPI;
|
|||
|
|
using Debug = UnityEngine.Debug;
|
|||
|
|
|
|||
|
|
#if UNITY_ANDROID && !UNITY_EDITOR
|
|||
|
|
using Babybus.Uno;
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#if UNITY_IOS
|
|||
|
|
using UnityEngine.iOS;
|
|||
|
|
#endif
|
|||
|
|
namespace Stary.Evo.Editor
|
|||
|
|
{
|
|||
|
|
public static class FileUtility
|
|||
|
|
{
|
|||
|
|
public static string GetStreamingAssetsPath(string fileName)
|
|||
|
|
{
|
|||
|
|
#if UNITY_ANDROID && !UNITY_EDITOR
|
|||
|
|
return System.IO.Path.Combine(Application.streamingAssetsPath+ "/Android",fileName);
|
|||
|
|
#elif UNITY_EDITOR
|
|||
|
|
return System.IO.Path.Combine("file://" + Application.streamingAssetsPath + "/Android", fileName);
|
|||
|
|
#elif UNITY_IOS
|
|||
|
|
return "file://"+ System.IO.Path.Combine(Application.streamingAssetsPath + "/IOS", fileName);
|
|||
|
|
#else
|
|||
|
|
return "";
|
|||
|
|
#endif
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 读取StreamingAssets目录文件
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="path"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static byte[] ReadStreamingAssets(string path)
|
|||
|
|
{
|
|||
|
|
#if UNITY_ANDROID && !UNITY_EDITOR
|
|||
|
|
var bytes = AndroidStreamingAssetSyncLoader.LoadFile(path);
|
|||
|
|
#else
|
|||
|
|
var bytes = File.ReadAllBytes(Application.streamingAssetsPath + "/" + path);
|
|||
|
|
#endif
|
|||
|
|
return bytes;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static void CreateDirectory(string path)
|
|||
|
|
{
|
|||
|
|
string directoryName = Path.GetDirectoryName(path);
|
|||
|
|
if (directoryName != "" && !Directory.Exists(directoryName))
|
|||
|
|
Directory.CreateDirectory(directoryName);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static void WriteAllText(string path, string content)
|
|||
|
|
{
|
|||
|
|
if (string.IsNullOrEmpty(path)) return;
|
|||
|
|
CreateDirectory(path);
|
|||
|
|
File.WriteAllText(path, content);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static void WriteAllBytes(string path, byte[] bytes)
|
|||
|
|
{
|
|||
|
|
if (string.IsNullOrEmpty(path)) return;
|
|||
|
|
CreateDirectory(path);
|
|||
|
|
File.WriteAllBytes(path, bytes);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static void Move(string sourceFileName, string destFileName)
|
|||
|
|
{
|
|||
|
|
if (sourceFileName == destFileName)
|
|||
|
|
return;
|
|||
|
|
if (!File.Exists(sourceFileName))
|
|||
|
|
return;
|
|||
|
|
CreateDirectory(destFileName);
|
|||
|
|
DeleteFile(destFileName);
|
|||
|
|
File.Move(sourceFileName, destFileName);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static void Copy(string sourceFileName, string destFileName, bool overwrite)
|
|||
|
|
{
|
|||
|
|
if (sourceFileName == destFileName)
|
|||
|
|
return;
|
|||
|
|
CreateDirectory(destFileName);
|
|||
|
|
File.Copy(sourceFileName, destFileName, overwrite);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static void CopyDirectory(string srcPath, string dstPath, bool overwrite = true,
|
|||
|
|
string excludeExtension = ".meta")
|
|||
|
|
{
|
|||
|
|
DeleteFile(dstPath);
|
|||
|
|
if (!Directory.Exists(dstPath))
|
|||
|
|
Directory.CreateDirectory(dstPath);
|
|||
|
|
foreach (var file in Directory.GetFiles(srcPath, "*.*")
|
|||
|
|
.Where(path => Path.GetExtension(path) != excludeExtension))
|
|||
|
|
{
|
|||
|
|
File.Copy(file, Path.Combine(dstPath, Path.GetFileName(file)), overwrite);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
foreach (var dir in Directory.GetDirectories(srcPath)
|
|||
|
|
.Where(path => Path.GetExtension(path) != excludeExtension))
|
|||
|
|
CopyDirectory(dir, Path.Combine(dstPath, Path.GetFileName(dir)), overwrite);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static void CopyDirectory(string srcPath, string dstPath, string[] excludeFileExtensions,
|
|||
|
|
string[] excludeDirectoryExtensions = null, bool overwrite = true)
|
|||
|
|
{
|
|||
|
|
if (!Directory.Exists(dstPath))
|
|||
|
|
Directory.CreateDirectory(dstPath);
|
|||
|
|
foreach (var file in Directory.GetFiles(srcPath, "*.*", SearchOption.TopDirectoryOnly).Where(path =>
|
|||
|
|
excludeFileExtensions == null || !excludeFileExtensions.Contains(Path.GetExtension(path))))
|
|||
|
|
{
|
|||
|
|
File.Copy(file, Path.Combine(dstPath, Path.GetFileName(file)), overwrite);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
foreach (var dir in Directory.GetDirectories(srcPath).Where(path =>
|
|||
|
|
excludeDirectoryExtensions == null ||
|
|||
|
|
!excludeDirectoryExtensions.Contains(Path.GetExtension(path))))
|
|||
|
|
CopyDirectory(dir, Path.Combine(dstPath, Path.GetFileName(dir)), excludeFileExtensions,
|
|||
|
|
excludeDirectoryExtensions, overwrite);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static void DeleteFile(string path)
|
|||
|
|
{
|
|||
|
|
if (File.Exists(path))
|
|||
|
|
File.Delete(path);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 文件是否被占用
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="fileName"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static bool IsFileInUse(string fileName)
|
|||
|
|
{
|
|||
|
|
if (File.Exists(fileName) == false) return false;
|
|||
|
|
bool inUse = true;
|
|||
|
|
FileStream fs = null;
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.None);
|
|||
|
|
inUse = false;
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
// ignored
|
|||
|
|
}
|
|||
|
|
finally
|
|||
|
|
{
|
|||
|
|
if (fs != null)
|
|||
|
|
fs.Close();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return inUse; //true表示正在使用,false没有使用
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 是否只读文件
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="path"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static bool IsReadOnly(string path)
|
|||
|
|
{
|
|||
|
|
if (!File.Exists(path)) return false;
|
|||
|
|
FileInfo fi = new FileInfo(path);
|
|||
|
|
return fi.IsReadOnly;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static void DeleteDirectory(string path)
|
|||
|
|
{
|
|||
|
|
if (Directory.Exists(path)) Directory.Delete(path, true);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static string GetFullPathWithoutExtension(string path)
|
|||
|
|
{
|
|||
|
|
return Path.GetDirectoryName(path) + "/" + Path.GetFileNameWithoutExtension(path);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static int GetFileSize(string path)
|
|||
|
|
{
|
|||
|
|
if (!File.Exists(path)) return 0;
|
|||
|
|
FileStream fs = new FileStream(path, FileMode.Open);
|
|||
|
|
long length = fs.Length;
|
|||
|
|
fs.Close();
|
|||
|
|
return (int)length;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 获取文件夹下所有文件路径
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="path"></param>
|
|||
|
|
/// <param name="extension">"*.mp3"</param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static string[] GetFiles(string path, string extension = "*")
|
|||
|
|
{
|
|||
|
|
if (File.Exists(path))
|
|||
|
|
{
|
|||
|
|
return Directory.GetFiles(path, extension, SearchOption.AllDirectories);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static void TakePhoto(Camera camera, string path, int width, int height, bool hideCamera = true)
|
|||
|
|
{
|
|||
|
|
Rect rect = new Rect(0, 0, width, height);
|
|||
|
|
camera.gameObject.SetActive(true);
|
|||
|
|
//特别注意事项
|
|||
|
|
camera.clearFlags = CameraClearFlags.SolidColor;
|
|||
|
|
var color = Color.black;
|
|||
|
|
color.a = 0.00001f;
|
|||
|
|
camera.backgroundColor = color;
|
|||
|
|
RenderTexture rt = new RenderTexture(width, height, 24);
|
|||
|
|
camera.targetTexture = rt;
|
|||
|
|
camera.Render();
|
|||
|
|
//ps: --- 如果这样加上第二个相机,可以实现只截图某几个指定的相机一起看到的图像。
|
|||
|
|
//ps: camera2.targetTexture = rt;
|
|||
|
|
//ps: camera2.Render();
|
|||
|
|
//ps: -------------------------------------------------------------------
|
|||
|
|
// 激活这个rt, 并从中中读取像素
|
|||
|
|
RenderTexture.active = rt;
|
|||
|
|
Texture2D texture = new Texture2D(width, height, TextureFormat.RGBA32, true);
|
|||
|
|
texture.ReadPixels(rect, 0, 0);
|
|||
|
|
texture.Apply();
|
|||
|
|
RenderTexture.active = null;
|
|||
|
|
camera.gameObject.SetActive(!hideCamera);
|
|||
|
|
byte[] bytes = texture.EncodeToPNG();
|
|||
|
|
WriteAllBytes(path, bytes);
|
|||
|
|
#if UNITY_EDITOR
|
|||
|
|
Debug.Log("截屏了一张照片: " + path);
|
|||
|
|
#endif
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static Texture2D LoadTextureByIO(string path, int width, int height)
|
|||
|
|
{
|
|||
|
|
//创建文件读取流
|
|||
|
|
FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read);
|
|||
|
|
fileStream.Seek(0, SeekOrigin.Begin);
|
|||
|
|
//创建文件长度缓冲区
|
|||
|
|
byte[] bytes = new byte[fileStream.Length];
|
|||
|
|
//读取文件
|
|||
|
|
fileStream.Read(bytes, 0, (int)fileStream.Length);
|
|||
|
|
//释放文件读取流
|
|||
|
|
fileStream.Close();
|
|||
|
|
fileStream.Dispose();
|
|||
|
|
fileStream = null;
|
|||
|
|
//创建Texture
|
|||
|
|
Texture2D texture = new Texture2D(width, height);
|
|||
|
|
texture.LoadImage(bytes);
|
|||
|
|
#if UNITY_EDITOR
|
|||
|
|
Debug.Log("跳场景或删除时要Destroy(texutre)掉,不然内存会增加");
|
|||
|
|
#endif
|
|||
|
|
return texture;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static Sprite LoadSpriteByIO(string fileName, int width, int height)
|
|||
|
|
{
|
|||
|
|
Texture2D texture2D = LoadTextureByIO(fileName, width, height);
|
|||
|
|
return Sprite.Create(texture2D, new Rect(0, 0, texture2D.width, texture2D.height), new Vector2(0.5f, 0.5f));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 硬盘检测方法
|
|||
|
|
public static bool CheckDriveExists(string driveLetter)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
// 确保输入格式正确(例如:"D:")
|
|||
|
|
if (!driveLetter.EndsWith(":\\"))
|
|||
|
|
driveLetter += ":\\";
|
|||
|
|
|
|||
|
|
foreach (DriveInfo drive in DriveInfo.GetDrives())
|
|||
|
|
{
|
|||
|
|
if (drive.IsReady && drive.Name.Equals(driveLetter, StringComparison.OrdinalIgnoreCase))
|
|||
|
|
{
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch (Exception e)
|
|||
|
|
{
|
|||
|
|
Debug.LogError($"检测硬盘时发生错误: {e.Message}");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 打开文件夹
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="path"></param>
|
|||
|
|
public static void OpenDirectory(string path)
|
|||
|
|
{
|
|||
|
|
#if UNITY_EDITOR
|
|||
|
|
if (string.IsNullOrEmpty(path)) return;
|
|||
|
|
path = path.Replace("/", "\\");
|
|||
|
|
if (!Directory.Exists(path))
|
|||
|
|
{
|
|||
|
|
Debug.LogError("No Directory: " + path);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
System.Diagnostics.Process.Start("explorer.exe", path);
|
|||
|
|
#endif
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|