我是C#的新手,并且被要求在我们的部署软件的插件中编写自定义任务,但我无法解决这个问题。我只是尝试将部署服务器上某个目录中的某些数据记录到输出日志中,但我只记录了第一个文件(然后即使文本出现乱码,我认为也是这样)在得到关于&#34的奇怪错误之前,以某种方式加载字节错误;附加信息:收集被修改;枚举操作可能无法执行。"
这是我到目前为止的代码:
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()修复了错误(我认为它会循环太多次但它没有)并且看起来我现在每个文件都有一个日志条目,但是消息仍然是乱码。有谁知道为什么会这样?
答案 0 :(得分:1)
你可以反向迭代myFiles
集合 (这样你就不会在删除每个文件时破坏集合),或者你可以简单地清除迭代完成后的集合(这将完成同样的事情)。
答案 1 :(得分:1)
您正在修改集合 myFiles.Remove(文件); 删除该行(因为它是原因)。
答案 2 :(得分:0)
在他的评论中,对于用于读取磁盘上文件的编码,Blorgbeard几乎肯定是正确的。请记住,Encoding.Unicode
实际上是UTF16,这有点令人困惑,如果我不得不猜测,可能不是你的文件编码的编码。
为了完整起见,我将使用IFileOperationsExecuter
上的ReadAllText()
扩展方法添加BuildMaster惯用方法来处理您的方案:
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编码,但是如果需要,有一个重载接受不同的编码。