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
}
///
/// 读取StreamingAssets目录文件
///
///
///
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);
}
///
/// 文件是否被占用
///
///
///
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没有使用
}
///
/// 是否只读文件
///
///
///
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;
}
///
/// 获取文件夹下所有文件路径
///
///
/// "*.mp3"
///
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;
}
///
/// 打开文件夹
///
///
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
}
}
}