【问题标题】:C# Collection was modified error with garbled text reading from fileC# 集合被修改错误,从文件中读取乱码文本
【发布时间】:2026-02-13 22:55:03
【问题描述】:

我是 C# 新手,曾被要求在插件中为我们的部署软件编写自定义任务,但我无法理解这一点。我只是想将部署服务器上某个目录中的一些数据记录到输出日志中,但我只记录了第一个文件(然后甚至文本都是乱码,我认为它以某种方式加载了错误的字节)在收到有关“附加信息:集合已修改;枚举操作可能无法执行”的奇怪错误之前。

这是我目前的代码:

class Clense : AgentBasedActionBase
{
    public string dataPath { get; set; }

    protected override void Execute()
    {
        IFileOperationsExecuter agent = Context.Agent.GetService<IFileOperationsExecuter>();
        GetDirectoryEntryCommand get = new GetDirectoryEntryCommand() { Path = dataPath };
        GetDirectoryEntryResult result = agent.GetDirectoryEntry(get);
        DirectoryEntryInfo info = result.Entry;
        // info has directory information
        List<FileEntryInfo> myFiles = info.Files.ToList();
        foreach (FileEntryInfo file in myFiles)
        {
            Byte[] bytes = agent.ReadFileBytes(file.Path);
            String s = Encoding.Unicode.GetString(bytes);
            LogInformation(s);
            // myFiles.Remove(file); 
        }
    }
}

有谁知道我可以做些什么来解决这个问题?

更新

删除 myFiles.Remove() 修复了错误(我认为它会循环太多次,但事实并非如此),看起来我现在每个文件都有一个日志条目,但消息仍然是乱码。有谁知道为什么会这样?

【问题讨论】:

  • 在枚举myFiles 时不能执行myFiles.Remove(file);。只要搜索错误,你应该找到many duplicates on *
  • 我确实看过那些,但我不想读两次文件。
  • 试试Encoding.UTF8而不是Unicode。

标签: c# .net sdk buildmaster


【解决方案1】:

在他的评论中,关于用于读取磁盘文件的编码,Blorgbeard 几乎可以肯定是正确的。请记住,Encoding.Unicode 实际上是 UTF16,这有点令人困惑,如果我不得不猜测,可能不是创建文件时使用的编码。

为了完整起见,我将添加 BuildMaster 惯用方式来处理您的场景,使用 ReadAllText() 扩展方法 IFileOperationsExecuter

protected override void Execute()
{
    var agent = this.Context.Agent.GetService<IFileOperationsExecuter>();
    var entry = agent.GetDirectoryEntry(new GetDirectoryEntryCommand() { Path = dataPath }).Entry;
    foreach(var file in entry.Files) 
    {
        string contents = agent.ReadAllText(file.Path);
        this.LogInformation(contents);
    }
}

ReadAllText() 方法将在内部采用 UTF8 编码,但有一个重载可以在必要时接受不同的编码。

【讨论】:

    【解决方案2】:

    您正在修改集合 我的文件。删除(文件); 删除该行(因为它是原因)。

    【讨论】:

      【解决方案3】:

      您可以以相反的方向迭代myFiles 集合(这样您在删除每个单独的文件时不会损坏集合),或者您可以在完成迭代它(这将完成同样的事情)。

      【讨论】:

      • 因为 myFiles 并没有真正被再次使用,他也可以从中删除任何东西。