UnityEditor下檔案操作方法彙總(Unity3D開發之二十四)
阿新 • • 發佈:2018-12-26
最近經常需要些一個編譯工作指令碼,經常操作一個檔案。下面是一個彙總了的檔案操作方法。
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
using System;
using System.IO;
using System.Threading;
public static class FileStaticAPI
{
/// 檢測檔案是否存在Application.dataPath目錄
public static bool IsFileExists (string fileName)
{
if (fileName.Equals (string .Empty)) {
return false;
}
return File.Exists (GetFullPath (fileName));
}
/// 在Application.dataPath目錄下建立檔案
public static void CreateFile (string fileName)
{
if (!IsFileExists (fileName)) {
CreateFolder (fileName.Substring (0, fileName.LastIndexOf ('/' )));
#if UNITY_4 || UNITY_5
FileStream stream = File.Create (GetFullPath (fileName));
stream.Close ();
#else
File.Create (GetFullPath (fileName));
#endif
}
}
/// 寫入資料到對應檔案
public static void Write (string fileName, string contents)
{
CreateFolder (fileName.Substring (0 , fileName.LastIndexOf ('/')));
TextWriter tw = new StreamWriter (GetFullPath (fileName), false);
tw.Write (contents);
tw.Close ();
AssetDatabase.Refresh ();
}
/// 從對應檔案讀取資料
public static string Read (string fileName)
{
#if !UNITY_WEBPLAYER
if (IsFileExists (fileName)) {
return File.ReadAllText (GetFullPath (fileName));
} else {
return "";
}
#endif
#if UNITY_WEBPLAYER
Debug.LogWarning("FileStaticAPI::CopyFolder is innored under wep player platfrom");
#endif
}
/// 複製檔案
public static void CopyFile (string srcFileName, string destFileName)
{
if (IsFileExists (srcFileName) && !srcFileName.Equals (destFileName)) {
int index = destFileName.LastIndexOf ("/");
string filePath = string.Empty;
if (index != -1) {
filePath = destFileName.Substring (0, index);
}
if (!Directory.Exists (GetFullPath (filePath))) {
Directory.CreateDirectory (GetFullPath (filePath));
}
File.Copy (GetFullPath (srcFileName), GetFullPath (destFileName), true);
AssetDatabase.Refresh ();
}
}
/// 刪除檔案
public static void DeleteFile (string fileName)
{
if (IsFileExists (fileName)) {
File.Delete (GetFullPath (fileName));
AssetDatabase.Refresh ();
}
}
/// 檢測是否存在資料夾
public static bool IsFolderExists (string folderPath)
{
if (folderPath.Equals (string.Empty)) {
return false;
}
return Directory.Exists (GetFullPath (folderPath));
}
/// 建立資料夾
public static void CreateFolder (string folderPath)
{
if (!IsFolderExists (folderPath)) {
Directory.CreateDirectory (GetFullPath (folderPath));
AssetDatabase.Refresh ();
}
}
/// 複製資料夾
public static void CopyFolder (string srcFolderPath, string destFolderPath)
{
#if !UNITY_WEBPLAYER
if (!IsFolderExists (srcFolderPath)) {
return;
}
CreateFolder (destFolderPath);
srcFolderPath = GetFullPath (srcFolderPath);
destFolderPath = GetFullPath (destFolderPath);
// 建立所有的對應目錄
foreach (string dirPath in Directory.GetDirectories(srcFolderPath, "*", SearchOption.AllDirectories)) {
Directory.CreateDirectory (dirPath.Replace (srcFolderPath, destFolderPath));
}
// 複製原資料夾下所有內容到目標資料夾,直接覆蓋
foreach (string newPath in Directory.GetFiles(srcFolderPath, "*.*", SearchOption.AllDirectories)) {
File.Copy (newPath, newPath.Replace (srcFolderPath, destFolderPath), true);
}
AssetDatabase.Refresh ();
#endif
#if UNITY_WEBPLAYER
Debug.LogWarning("FileStaticAPI::CopyFolder is innored under wep player platfrom");
#endif
}
/// 刪除資料夾
public static void DeleteFolder (string folderPath)
{
#if !UNITY_WEBPLAYER
if (IsFolderExists (folderPath)) {
Directory.Delete (GetFullPath (folderPath), true);
AssetDatabase.Refresh ();
}
#endif
#if UNITY_WEBPLAYER
Debug.LogWarning("FileStaticAPI::DeleteFolder is innored under wep player platfrom");
#endif
}
/// 返回Application.dataPath下完整目錄
private static string GetFullPath (string srcName)
{
if (srcName.Equals (string.Empty)) {
return Application.dataPath;
}
if (srcName [0].Equals ('/')) {
srcName.Remove (0, 1);
}
return Application.dataPath + "/" + srcName;
}
/// 在Assets下建立目錄
public static void CreateAssetFolder (string assetFolderPath)
{
if (!IsFolderExists (assetFolderPath)) {
int index = assetFolderPath.IndexOf ("/");
int offset = 0;
string parentFolder = "Assets";
while (index != -1) {
if (!Directory.Exists (GetFullPath (assetFolderPath.Substring (0, index)))) {
string guid = AssetDatabase.CreateFolder (parentFolder, assetFolderPath.Substring (offset, index - offset));
// 將GUID(全域性唯一識別符號)轉換為對應的資源路徑。
AssetDatabase.GUIDToAssetPath (guid);
}
offset = index + 1;
parentFolder = "Assets/" + assetFolderPath.Substring (0, offset - 1);
index = assetFolderPath.IndexOf ("/", index + 1);
}
AssetDatabase.Refresh ();
}
}
/// 複製Assets下內容
public static void CopyAsset (string srcAssetName, string destAssetName)
{
if (IsFileExists (srcAssetName) && !srcAssetName.Equals (destAssetName)) {
int index = destAssetName.LastIndexOf ("/");
string filePath = string.Empty;
if (index != -1) {
filePath = destAssetName.Substring (0, index + 1);
//Create asset folder if needed
CreateAssetFolder (filePath);
}
AssetDatabase.CopyAsset (GetFullAssetPath (srcAssetName), GetFullAssetPath (destAssetName));
AssetDatabase.Refresh ();
}
}
/// 刪除Assets下內容
public static void DeleteAsset (string assetName)
{
if (IsFileExists (assetName)) {
AssetDatabase.DeleteAsset (GetFullAssetPath (assetName));
AssetDatabase.Refresh ();
}
}
/// 獲取Assets下完整路徑
private static string GetFullAssetPath (string assetName)
{
if (assetName.Equals (string.Empty)) {
return "Assets/";
}
if (assetName [0].Equals ('/')) {
assetName.Remove (0, 1);
}
return "Assets/" + assetName;
}
}
#endif
需要的可以拿去用用。