2

私は 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() を削除するとエラーが修正され (ループが多すぎると思っていましたが、そうではありません)、ファイルごとに 1 つのログ エントリを取得しているように見えますが、メッセージはまだ文字化けしています。なぜこれが起こっているのか誰にも分かりますか?

4

3 に答える 3

1

myFilesコレクションを逆方向に反復するか(個々のファイルを削除するときにコレクションが破損しないようにするため)、または反復が完了したらコレクションを単純にクリアすることができます (同じことを達成します)。

于 2014-09-30T20:49:41.897 に答える
1

コレクションを myFiles.Remove(file); で変更しています。その行を削除します(それが原因であるため)。

于 2014-09-30T20:49:54.000 に答える
0

彼のコメントでは、ディスク上のファイルを読み取るために使用されるエンコーディングに関して、Blorgbeard はほぼ間違いなく正しいと述べています。これは実際には UTF16 であることを覚えておいてくださいEncoding.Unicode。これはやや紛らわしいですが、推測する必要がある場合は、ファイルが作成されたときに使用されたエンコーディングではない可能性があります。

ReadAllText()完全を期すために、拡張メソッド onを使用してシナリオを処理する BuildMaster の慣用的な方法を追加します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 エンコーディングを想定していますが、必要に応じて別のエンコーディングを受け入れるオーバーロードがあります。

于 2014-10-07T20:52:10.103 に答える