查找文件的引用

该代码实现了一个Unity编辑器窗口脚本,用于查找Assets/Resources/Effects/Skill/Material/WM文件夹下所有子文件的引用情况。它遍历项目中的特定文件类型,如.prefab,.unity,.mat,.asset,检查是否有其他文件引用它们。如果找到未被引用的素材,会提示用户可能需要考虑删除以节省磁盘空间和提高性能。

遇到问题: material不知有无被引用,无引用的material留着占用磁盘,也会被UPR提示过多而影响性能考评
从而扩展出问题,特效的png文件夹贼大,也不知有无被引用过,若无,就太浪费了

此为文件夹的操作,时长因项目的大小而定的

using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using UnityEditor;
using UnityEngine;
using Path = System.IO.Path;
//作  用:    FindFolderChildRef 
//作  者:    zsx
//创建时间:  2023/06/26 09:02
public class FindFolderChildRef : EditorWindow
{
    string mInputTxt = @"Assets\_Resources\Effects\Skill\Material\WM";
    [MenuItem("Tools/辅助工具/查引用文件夹(子文件的引用)")]
    public static void CreateUsageCheckerWindow()
    {
        EditorWindow.GetWindow<FindFolderChildRef>("文件夹(子文件的引用)");
    }
    void OnGUI()
    {
        EditorGUILayout.LabelField("输入的最小文件夹,查询的是子文件引用,\r\n因项目资源多,查询耗时长,请在饭点操作吧", GUILayout.MinHeight(50));
        EditorGUILayout.Space(5);
        mInputTxt = EditorGUILayout.TextField(mInputTxt, GUILayout.MinWidth(200), GUILayout.MinHeight(22));
        EditorGUILayout.Space(5);
        if (GUILayout.Button("查询文件夹的子文件引用_耗时长", GUILayout.MinHeight(30)))
        {
            CheckFolderUsage(mInputTxt); // 替换为要检查的文件夹路径          
        }
    }
    void CheckFolderUsage(string folderPath)
    {
        string[] assetPaths = AssetDatabase.FindAssets("", new[] { folderPath });
        var guidDics = new Dictionary<string, string>();
        var hasRefDic = new Dictionary<string, bool>();
        var count = 0;
        foreach (string guid in assetPaths)
        {
            string path = AssetDatabase.GUIDToAssetPath(guid);
            string fileName = Path.GetFileNameWithoutExtension(path);
            if (guidDics.ContainsKey(guid) == false)
            {
                guidDics[guid] = fileName;

                hasRefDic[fileName] = false;
                count++;
            }
        }
        var bottomLog = "{0}在{1}查找中";
        var topLog= "查找引用中(*.prefab,*.unity,*.mat,*.asset)_{0}/{1}_结果看Console";
        var indexFind = 0;
        var files = GetAllDic();
        foreach (var guidItem in guidDics)
        {   
            for (int i = 0; i < files.Length; i++)
            {
                if (hasRefDic[guidItem.Value] ==true)
                {
                    break;
                }
                string file = files[i];
                if (i % 20 == 0)
                {                   
                    bool isCancel = EditorUtility.DisplayCancelableProgressBar(string.Format(topLog, indexFind,count), string.Format(bottomLog, guidItem.Value, Path.GetFileNameWithoutExtension(file)), (float)i / (float)files.Length);
                    if (isCancel)
                    {
                        break;
                    }
                }
                if (hasRefDic[guidItem.Value] == false && Regex.IsMatch(File.ReadAllText(file), guidItem.Key))
                {
                    hasRefDic[guidItem.Value] = true;             
                }
            }
            indexFind++;
        }
        

        var noneRef = 0;
        StringBuilder sbItem = new StringBuilder();
        foreach (var item in hasRefDic)
        {
            if (item.Value == false)
            {
                sbItem.Append(item.Key + " ; ");
                noneRef++;
            }
        }
        var strLog = mInputTxt + "目录下,共计未引用有" + noneRef + "个,分别是:" + sbItem.ToString();
        EditorGUIUtility.systemCopyBuffer = strLog;
        Debug.LogError(strLog);
        EditorUtility.ClearProgressBar();
        ShowNotification(new GUIContent("查找的结果,已copy到剪切板了,请看console_Log"));
    }

    static string[] allDic;
    static string[] GetAllDic()
    {
        if (allDic == null || allDic.Length <= 0)
        {
            var withoutExtentsions = new List<string>() { ".prefab", ".unity", ".mat", ".asset" };
            allDic = Directory.GetFiles(Application.dataPath "*.*", SearchOption.AllDirectories).Where(s => withoutExtentsions.Contains(Path.GetExtension(s).ToLower())).ToArray();
            //allDic = Directory.GetFiles(Application.dataPath+ "/_Resources/Effects", "*.*", SearchOption.AllDirectories).Where(s => withoutExtentsions.Contains(Path.GetExtension(s).ToLower())).ToArray();//若自己知道,则指定文件夹搜索,省时
        }
        return allDic;
    }
}

在这里插入图片描述

此为单独文件操作

using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using UnityEditor;
using UnityEngine;
#region << 脚 本 注 释 >>
//作  用:    FindFileRef
//作  者:    zsx
//创建时间:  2023/06/25 17:02
#endregion

public class FindFileRef
{
    static bool mIsHasRef = false;
    [MenuItem("Assets/Find References(查引用)", false, 10)]
    static void Find()
    {
        var guidDics = new Dictionary<string, string>();
        foreach (Object item in Selection.objects)
        {
            string path = AssetDatabase.GetAssetPath(item);
            if (string.IsNullOrEmpty(path) == false)
            {
                string guid = AssetDatabase.AssetPathToGUID(path);
                if (guidDics.ContainsKey(guid) == false)
                {
                    guidDics[guid] = item.name;
                }
            }
        }
        if (guidDics.Count > 0)
        {
            Debug.LogError("查找引用 开始");
            mIsHasRef = false;
            var withoutExtentsions = new List<string>() { ".prefab", ".unity", ".mat", ".asset" };
            string[] files = Directory.GetFiles(Application.dataPath, "*.*", SearchOption.AllDirectories).Where(s => withoutExtentsions.Contains(Path.GetExtension(s).ToLower())).ToArray();
            for (int i = 0; i < files.Length; i++)
            {
                string file = files[i];
                if (i % 20 == 0)
                {
                    bool isCancel = EditorUtility.DisplayCancelableProgressBar("查找引用中(*.prefab,*.unity,*.mat,*.asset)__结果看Console", file, (float)i / (float)files.Length);
                    if (isCancel)
                    {
                        break;
                    }
                }
                foreach (var guidItem in guidDics)
                {
                    if (Regex.IsMatch(File.ReadAllText(file), guidItem.Key))
                    {
                        mIsHasRef = true;
                        Debug.Log("查找的是=" + guidItem.Value + ",引用者=" + AssetDatabase.LoadAssetAtPath<Object>(GetRelativeAssetsPath(file)) + ",文件路径=" + file);
                    }
                }
            }
            EditorUtility.ClearProgressBar();
            if (mIsHasRef)
            {
                Debug.LogError("查找引用 结束");
            }
            else
            {
                Debug.LogError("查找引用 结束,并无引用,请考虑删除否");
            }
        }
    }

    [MenuItem("Assets/Find References(查引用)", true)]
    static bool VFind()
    {
        string path = AssetDatabase.GetAssetPath(Selection.activeObject);
        return (string.IsNullOrEmpty(path) == false);
    }

    private static string GetRelativeAssetsPath(string file)
    {
        return "Assets" + Path.GetFullPath(file).Replace(Path.GetFullPath(Application.dataPath), "").Replace("\\", "/");
    }
}

单独查询 选中资源 右键在这里插入图描述

<think>好的,我现在需要回答用户的问题:“vscode查找文件被哪些文件引用了”。首先,我需要理解用户的需求。用户可能在使用VSCode时,想要知道某个特定的文件被项目中的其他哪些文件引用过。比如,当修改或删除一个文件时,了解其引用情况可以帮助避免破坏其他代码。 接下来,我应该回忆一下VSCode的相关功能。VSCode本身有没有直接支持这种查找的功能呢?我记得有“查找所有引用”的功能,但通常是针对符号(比如函数、变量)的,而不是整个文件。不过,可能有一些扩展或者设置可以实现基于文件的引用查找。 然后,我需要考虑不同的情况。例如,如果用户使用的是JavaScript/TypeScript项目,可能有内置的引用查找功能,但对于其他类型文件或者更广泛的引用情况,可能需要其他方法。另外,用户可能需要全局搜索文件名,或者使用扩展来更智能地分析引用关系。 接下来,我应该分步骤解释如何在VSCode中进行这样的操作。可能包括使用搜索功能、安装特定扩展、配置设置等。同时,需要注意不同操作系统下的快捷键差异,以及不同编程语言的支持情况。 还需要考虑用户可能的误区,比如混淆“符号引用”和“文件引用”,这时候需要说明两者的区别,并指导正确的使用方法。此外,可能需要提到一些注意事项,比如搜索范围、文件类型限制等。 最后,确保回答清晰、有条理,并且提供足够的细节帮助用户实际操作。同时,根据之前的示例,保持回答的结构,包括步骤说明、相关问题等。 </think>在 Visual Studio Code (VSCode) 中,查找某个文件被哪些文件引用了,可以通过以下方法实现: --- ### **方法 1:使用全局搜索(基础方法)** 1. **打开全局搜索面板**: - 快捷键:`Ctrl + Shift + F`(Windows/Linux)或 `Cmd + Shift + F`(Mac)。 - 或点击左侧工具栏的放大镜图标。 2. **输入文件名或路径**: - 在搜索框中输入目标文件名(如 `utils.js`)或完整路径(如 `/src/utils/utils.js`)。 - 启用正则表达式(可选):点击 `.*` 按钮,输入更复杂的匹配规则。 3. **查看结果**: - 搜索结果会显示所有包含该文件名的引用位置(如导入语句、路径引用等)。 - 示例: ```javascript // 文件:/src/main.js import { helper } from '../utils/utils.js'; // 引用了 utils.js ``` 4. **限制搜索范围**(可选): - 在搜索框下方的 "files to include" 输入框中指定文件类型(如 `*.js, *.ts`)或排除文件(如 `!**/node_modules/**`)。 --- ### **方法 2:使用“查找所有引用”功能(符号级引用)** 如果目标文件是代码文件(如 JavaScript、TypeScript、Python 等),且引用关系是通过符号(如函数、类、变量)建立的: 1. **打开目标文件**:在编辑器中打开需要查找的文件(如 `utils.js`)。 2. **定位符号引用**: - 右键点击文件中的某个符号(如函数名、类名),选择 **"Find All References"**(或快捷键 `Shift + F12`)。 - 结果会显示该符号在项目中的所有引用位置。 > **局限性**:此方法仅适用于符号级别的引用分析(如函数、变量),无法直接分析整个文件的引用关系。 --- ### **方法 3:使用扩展(推荐)** VSCode 扩展市场提供了一些插件,可直接分析文件引用关系: #### 推荐扩展: 1. **"File References"**: - 功能:自动分析文件被哪些文件引用。 - 安装后右键点击文件 → 选择 **"Find References to File"**。 2. **"Import Cost"**: - 功能:显示文件导入的大小和引用路径(适用于 JavaScript/TypeScript)。 3. **"Project Graph"**: - 功能:可视化项目依赖关系图。 --- ### **方法 4:使用终端命令(高级用户)** 在项目根目录下使用命令行工具(如 `grep` 或 `find`): ```bash # 查找所有引用 "utils.js" 的文件 grep -r "utils.js" . --include="*.js" --include="*.ts" ``` 输出示例: ``` ./src/main.js:import { helper } from '../utils/utils.js'; ./tests/test-utils.js:const utils = require('../../utils/utils.js'); ``` --- ### **方法 5:语言服务器支持(特定语言)** 某些语言(如 TypeScript)的内置语言服务器支持文件引用分析: 1. 右键点击文件标签页 → 选择 **"Open References"**。 2. 查看引用该文件的所有位置。 --- ### **注意事项** 1. **区分“硬引用”和“软引用”**: - 硬引用:代码中通过 `import`、`require`、`#include` 等直接引用。 - 软引用:通过动态路径或字符串拼接引用(如 `fs.readFileSync('utils.js')`),这类引用无法通过静态分析发现。 2. **配置 `.vscode/settings.json`**: - 确保搜索范围包含项目根目录。 - 排除 `node_modules`、`.git` 等无关目录: ```json { "search.exclude": { "**/node_modules": true, "**/.git": true } } ``` --- ### **示例场景** 假设项目结构如下: ``` project/ ├── src/ │ ├── main.js │ └── utils/ │ └── helpers.js └── tests/ └── test-helpers.js ``` 要查找 `helpers.js` 被哪些文件引用: 1. **全局搜索**: - 输入 `helpers.js`,结果会显示 `main.js` 和 `test-helpers.js`。 2. **扩展分析**: - 使用 "File References" 扩展,右键点击 `helpers.js` → "Find References to File"。 --- ### **相关问题** 1. 如何在 VSCode 中快速跳转到文件引用位置? 2. 为什么全局搜索无法找到某些引用? 3. 如何分析动态路径引用(如 `require(path.join(...))`)? 4. 哪些扩展支持 Python 文件的引用分析? 5. 如何配置 VSCode 忽略特定目录的引用搜索?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值