unity小工具 在编辑器面板上显示文件和文件夹的大小

显示效果

代码部分如下:

#if UNITY_EDITOR
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;

public static class FileCapacity
{
    private const string REMOVE_STR = "Assets";
    private const string FILESIZE = "FileSize";

    private static readonly int mRemoveCount = REMOVE_STR.Length;
    private static readonly Color mColor = new Color(0.635f, 0.635f, 0.635f, 1);
    private static Dictionary<string, string> DirSizeDictionary = new Dictionary<string, string>();
    private static List<string> DirList = new List<string>();
    private static bool isShowSize = true;

    [MenuItem("Tools/FileSize/OpenPlaySize")]
    private static void OpenPlaySize()
    {
        EditorPrefs.SetBool(FILESIZE, true);
        isShowSize = true;
        GetPropjectDirs();
    }

    [MenuItem("Tools/FileSize/ClosePlaySize")]
    private static void ClosePlaySize()
    {
        EditorPrefs.SetBool(FILESIZE, false);
        isShowSize = false;
        Init();
    }

    [InitializeOnLoadMethod]
    private static void InitializeOnLoadMethod()
    {
        EditorApplication.projectChanged += GetPropjectDirs;
        EditorApplication.projectWindowItemOnGUI += OnGUI;
    }

    [UnityEditor.Callbacks.DidReloadScripts]
    private static void OnScriptsReloaded()
    {
        GetPropjectDirs();
    }

    private static void GetPropjectDirs()
    {
        Init();
        if (isShowSize == false) return;
        GetAllDirecotries(Application.dataPath);
        foreach (string path in DirList)
        {
            string newPath = path.Replace("\\", "/");
            DirSizeDictionary.Add(newPath, GetFormatSizeString((int)GetDirectoriesSize(path)));
        }
    }
    private static void Init()
    {
        isShowSize = EditorPrefs.GetBool(FILESIZE);
        DirSizeDictionary.Clear();
        DirList.Clear();
    }

    private static void OnGUI(string guid, Rect selectionRect)
    {
        if (isShowSize == false) return;
        var dataPath = Application.dataPath;
        var startIndex = dataPath.LastIndexOf(REMOVE_STR);
        var dir = dataPath.Remove(startIndex, mRemoveCount);
        var path = dir + AssetDatabase.GUIDToAssetPath(guid);
        string text = null;
        if (DirSizeDictionary.ContainsKey(path))
        {
            text = DirSizeDictionary[path];
        }
        else if (File.Exists(path))
        {
            var fileInfo = new FileInfo(path);
            var fileSize = fileInfo.Length;
            text = GetFormatSizeString((int)fileSize);
        }
        else
        {
            return;
        }

        var label = EditorStyles.label;
        var content = new GUIContent(text);
        var width = label.CalcSize(content).x + 10;

        var pos = selectionRect;
        pos.x = pos.xMax - width;
        pos.width = width;
        pos.yMin++;

        var color = GUI.color;
        GUI.color = mColor;
        GUI.DrawTexture(pos, EditorGUIUtility.whiteTexture);
        GUI.color = color;
        GUI.Label(pos, text);
    }

    private static string GetFormatSizeString(int size)
    {
        return GetFormatSizeString(size, 1024);
    }

    private static string GetFormatSizeString(int size, int p)
    {
        return GetFormatSizeString(size, p, "#,##0.##");
    }

    private static string GetFormatSizeString(int size, int p, string specifier)
    {
        var suffix = new[] { "", "K", "M", "G", "T", "P", "E", "Z", "Y" };
        int index = 0;

        while (size >= p)
        {
            size /= p;
            index++;
        }

        return string.Format(
            "{0}{1}B",
            size.ToString(specifier),
            index < suffix.Length ? suffix[index] : "-"
        );
    }

    private static void GetAllDirecotries(string dirPath)
    {
        if (Directory.Exists(dirPath) == false)
        {
            return;
        }
        DirList.Add(dirPath);
        DirectoryInfo[] dirArray = new DirectoryInfo(dirPath).GetDirectories();
        foreach (DirectoryInfo item in dirArray)
        {
            GetAllDirecotries(item.FullName);
        }
    }

    private static long GetDirectoriesSize(string dirPath)
    {
        if (Directory.Exists(dirPath) == false)
        {
            return 0;
        }

        long size = 0;
        DirectoryInfo dir = new DirectoryInfo(dirPath);
        foreach (FileInfo info in dir.GetFiles())
        {
            size += info.Length;
        }

        DirectoryInfo[] dirBotton = dir.GetDirectories();
        foreach (DirectoryInfo info in dirBotton)
        {
            size += GetDirectoriesSize(info.FullName);
        }
        return size;
    }
}
#endif

在Tools/FileSize 里面可以选择打开和关闭显示大小 并且可以保存上一次操作哟

原文地址:https://www.cnblogs.com/lihengbk/p/11560108.html

时间: 2024-10-26 20:39:34

unity小工具 在编辑器面板上显示文件和文件夹的大小的相关文章

文件管理(页面上显示文件和文件夹,文件夹可以打开也可以返回上一层文件夹)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

js兼容ie获取上传excel文件名称以及大小,绝对路径

/**  *   * @param obj file对象 document.getElementById(elementId);  * @returns  */ function getExcelFileFullPath(obj){ if (obj){ // ie if (window.navigator.userAgent.indexOf("MSIE") >= 1){ obj.select(); return document.selection.createRange().t

FTP上传指定文件夹及其文件到服务器

1.在服务器端的IIS上建立一个FTP站点 注意事项:路径关联到你要存放(上传内容)的文件夹名称: 指定这个FTP站点的ip地址和端口号 2.本地准备代码 -------------------------------2.1上传类--------------------------------------------------------- public class Up    {        /// <summary>        ///   上传文件菜单        /// <

Linux下的一个高速跳转到上N层文件夹的简单方法

编辑文件 vim .bashrc  (使改动在当前用户下有效) 或者 vim /etc/profile (须要在root用户下运行,使改动在全部用户下有效) 在文件结尾加入别名 alias cd1='cd ..' alias cd2='cd ../..' alias cd3='cd ../../..' alias cd4='cd ../../../..' alias cd5='cd ../../../../..' alias cd6='cd ../../../../../..' 保存文件退出 为

从本地上传整个文件夹到hdfs的java程序

首先在网上找了好久没有找到从本地文件系统上传整个文件夹到hdfs文件系统的程序,权威指南上也没有,都是单个文件上传,所以这里自己编写了一个程序,封装成jar包运行可以复制. 先说明一下代码:需要手动输入两个路径,一个本地文件/文件夹路径,第二个是hdfs文件夹路径.好直接上代码: import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.Input

[转自知乎] 从github上下载单个文件夹

原文地址: 如何从 GitHub 上下载单个文件夹? 原文地址:https://www.cnblogs.com/Newdawn/p/9552659.html

如何在桌面上创建程序文件夹让每个登录用户都能访问呢?

如何在桌面上创建程序文件夹让每个登录用户都能访问呢? ?Lander Zhang 专注外企按需IT基础架构运维服务,IT Helpdesk 实战培训践行者博客:https://blog.51cto.com/lander IT Helpdesk 工程师实战培训课程:https://edu.51cto.com/lecturer/733218.html轻松进外企:IT Helpdesk工程师实战自学之路:https://blog.51cto.com/lander/2413018更新时间:2019/8/

使用 vscode将本地项目上传到github、从github克隆项目以及删除github上的某个文件夹

一.将本地项目上传到github 1.创建本地仓库(文件夹) mkdir study//创建文件夹studycd study //进入study文件夹 2.通过命令git init把这个文件夹变成Git可管理的仓库git init //把这个文件夹变成Git可以管理的仓库 这时可以发现study里面多了个.git文件夹,它是Git用来跟踪和管理版本库的.如果你看不到,是因为它默认是隐藏文件,那你就需要设置一下让隐藏文件可见. 3.把项目粘贴到这个本地Git仓库里面(粘贴后你可以通过git sta

网页上传整个文件夹

网页上传整个文件夹+断点续传 一.概述 所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载.在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了.一般断点下载时才用到Range和Content-Range实体头.HTTP协议本身不支持断点上传,需要自己实现. 二.Range 用于请求头中,指定第一个字节的位置和最后一个字节的位置,一般格式: Range:用于客户端到服务端的请求,可以通过改字段指定下载文件的某一段大小及其单位,字节偏移从0开始.典型格式: Ra