希望支持长路径

功能建议 · 1144 次浏览
gdvjg 创建于 2天13小时前

目前不支持长路径,希望能支持


回复内容
CL 2天13小时前
#1

哪个地方? 

gdvjg 回复 CL 2天13小时前 :

在获取子文件夹,如果路径过长就获取不了,移动文件也是,目标路径过长就移动不了,但是我电脑已经开启了长路径了,已经没有260字符的限制

CL 回复 gdvjg 2天13小时前 :

有相关的报错信息么? 调试文件什么的

gdvjg 回复 CL 2天13小时前 :

https://temp.getquicker.net/311786/37a6ee6628a04921985ab43b02214be2.html

CL 回复 gdvjg 2天12小时前 :

长路径是新修改的么? 试试重启一下windows看看。 windows是什么版本?

gdvjg 回复 CL 2天12小时前 :

不是新修改的,已经有重启过了,Windows 10 IoT 企业版 LTSC 21H2 19044.6093

CL 回复 gdvjg 2天12小时前 :

这个看起来是.net的内部API的报错,目前Quicker里没有设置的地方。AI说windows里设置好以后应该就行了😂

指定的路径或文件名太长,或者两者都太长。完全限定文件名必须少于 260 个字符,并且目录名必须少于 248 个字符。
在 System.IO.PathHelper.GetFullPathName()

gdvjg 回复 CL 2天12小时前 :

要为每个应用程序启用新的长路径行为,必须满足两个条件。 必须设置注册表值,应用程序清单必须包含 longPathAware 元素。
来源:
最大路径长度限制 - Win32 apps | Microsoft Learn
不知道是不是这个原因,我还看到说什么.net的版本太低了,什么之类的原因,反正就是现在不支持长路径,至少在我这不支持

CL 回复 gdvjg 2天10小时前 :

我试试加一下 longPathAware 

H-D-G 回复 CL 2天8小时前 :

H-D-G 最后更新于 2天8小时前
CL 回复 gdvjg 1天18小时前 :

https://getquicker.cn/Quicker.x64.1.44.23.0.msi 试一下这个版本看看。

gdvjg 回复 CL 1天16小时前 :

获取子文件夹,移动,复制,文件路径过长的时候都可以了,没有报错,但是我在运行c#代码的时候,遇到读取路径过长还是会报错
读取目录错误: 指定的路径或文件名太长,或者两者都太长。完全限定文件名必须少于 260 个字符,并且目录名必须少于 248 个字符。

CL 回复 gdvjg 1天16小时前 :

具体什么样的代码? 如何运行的? 发下截图看看。

gdvjg 回复 CL 1天16小时前 :

using System;
using System.Collections.Generic;
using System.IO;
using System.Windows.Forms;

public static void Exec(Quicker.Public.IStepContext context)
{
    try
    {
        // 1. 获取传入的路径参数
        string path = context.GetVarValue("path") as string;
        context.SetVarValue("debugInfo", $"开始处理路径: {path}");
        
        // 2. 检查路径有效性
        if (string.IsNullOrWhiteSpace(path))
        {
            throw new ArgumentException("路径不能为空");
        }

        // 3. 处理长路径(超过260字符)
        string longPath = path;
        if (path.Length > 260 && !path.StartsWith(@"\\?\"))
        {
            if (path.StartsWith(@"\\"))
            {
                longPath = @"\\?\UNC\" + path.Substring(2);
            }
            else
            {
                longPath = @"\\?\" + path;
            }
            context.SetVarValue("debugInfo", $"启用长路径模式: {longPath}");
        }

        // 4. 验证目录是否存在
        if (!Directory.Exists(longPath) && !Directory.Exists(path))
        {
            throw new DirectoryNotFoundException($"目录不存在: {path}");
        }

        // 5. 获取目录内容
        List<string> results = new List<string>();
        
        // 获取子目录
        try
        {
            foreach (string dir in Directory.GetDirectories(longPath))
            {
                results.Add(dir);
            }
        }
        catch (Exception ex)
        {
            context.SetVarValue("debugInfo", $"读取目录错误: {ex.Message}");
        }

        // 获取文件
        try
        {
            foreach (string file in Directory.GetFiles(longPath))
            {
                results.Add(file);
            }
        }
        catch (Exception ex)
        {
            context.SetVarValue("debugInfo", $"读取文件错误: {ex.Message}");
        }

        // 6. 返回结果
        context.SetVarValue("list", results);
        context.SetVarValue("debugInfo", $"成功获取 {results.Count} 个项目");
    }
    catch (Exception ex)
    {
        // 7. 错误处理
        context.SetVarValue("debugInfo", $"❌ 错误: {ex.Message}");
        context.SetVarValue("list", new List<string>());
        throw;
    }
}

就是普通模式v2,传入的path是一个长路径就报错,如果path是短路径是正常输出list

CL 回复 gdvjg 1天16小时前 :

哪一行报错的?发下调试运行网址看看

gdvjg 回复 CL 1天16小时前 :

https://temp.getquicker.net/311786/2035546cd78940cb9bd954f58d260f66.html

https://temp.getquicker.net/311786/277946ba7f434e2bab4857665ddb7b4d.html

CL 回复 gdvjg 1天14小时前 :

看起来   Directory.GetDirectories 会报错。 试一下直接用步骤里获取子文件夹会不会报错呢?这里也使用了   Directory.GetDirectories 方法。


gdvjg 回复 CL 1天13小时前 :

会报错,

CL 回复 gdvjg 1天13小时前 :

AI提供的办法,试试在路径前面加 \\?\ 

gdvjg 回复 CL 1天13小时前 :

还是不行,现在是如果输入的是短路径,那他可以获取到长路径子文件夹和文件,但是如果输入的是长路径,就会报错

CL 回复 gdvjg 1天13小时前 :

那可能就不行了,这个地方是.net底层的实现。 等2.0升级到.net9再试试了。 当前比较节省时间的方法还是尽量不要出现过长的目录了😂。

回复主贴