框架上传
This commit is contained in:
311
Assets/00.StaryEvo/Editor/Tools/FileUtility.cs
Normal file
311
Assets/00.StaryEvo/Editor/Tools/FileUtility.cs
Normal file
@@ -0,0 +1,311 @@
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user