0

こんにちは、アプリケーション内の RoboCopy メソッドによって生成されたログファイルからコピーされたファイル数の値を取得しようとしています。ログファイルは常に次の形式です。


ROBOCOPY :: Windows 用の堅牢なファイル コピー :: バージョン XP010

開始: 2013 年 10 月 10 日木曜日 10:08:51

ソース: \ad\nas\Dev_Code\ITA\Stats\11.6.4.15\CFI\Build\ 宛先: C:\inetpub\CFI\

Files : *.*

オプション: . /FFT /NFL /TEE /S /E /COPY:DAT /Z /IS /R:5 /W:5


                   1    \\ad\nas\Dev_Code\ITA\Stats\11.6.4.15\CFI\Build\

            Total    Copied   Skipped  Mismatch    FAILED    Extras
 Dirs :         1         0         1         0         0         0
**Files :         1**         1         0         0         0         0
Bytes :    1.62 m    1.62 m         0         0         0         0
Times :   0:00:03   0:00:02                       0:00:00   0:00:00

Speed :              607364 Bytes/sec.
Speed :              34.753 MegaBytes/min.

Ended : Thu Oct 10 10:08:59 2013

これまでのところ、ファイルをストリームリーダーに読み込むことはできますが、常に Files の最後のインスタンスを選択していることを確認するためにできることはありますか : そして、 Total 列の下の値、つまり 1

try
{
// Open file for reading.
using (StreamReader r = new StreamReader(@"C:\LogFile.log"))
{
    // 2.
    // Read each line until EOF.
    string line;
    while ((line = r.ReadLine()) != null)
    {
        // 3.
        // Do stuff with line.
        if (line.Contains("Files"))
        {
            String content = line.ToString();
            char sep = '\t';
            string[] splitContent = content.Split(sep);
            Console.WriteLine(splitContent);
        }                        
    }
}
}
catch (Exception)
{

throw;
}

min = System.String[] での出力

4

3 に答える 3

2

配列の2 番目の項目を選択するだけです。

Console.WriteLine(splitContent[1]);

考えてみてください、行データは次のようになります

Files :\t1\t1\t0\t0\t0\t0

content.Split(sep)配列を呼び出すと、次のようになります

0: "Files :"
1: "1"
2: "1"
3: "0"
4: "0"
5: "0"
6: "0"

したがって、これをに関してマップする場合は、常にTotalインデックスにある列1(0ラベル列) を取得する必要があります。


ここで読みやすくするために emum を使用することもできます。

enum Columns
{
    Label,
    Total,
    Copied,
    Skipped,
    Mismatch,
    Failed,
    Extra
}

...
string[] rowData = content.Split('\t');
Console.WriteLine(rowData[(int)Columns.Total]);

または、 a を使用しconstてキャストを回避します

const int TotalCol = 1;

...
string[] rowData = content.Split('\t');
Console.WriteLine(rowData[TotalCol]);
于 2013-10-17T09:46:49.500 に答える
0

ここに私の完全な実例があります:

static void Main()
    {
        try
        {              
            // Open file for reading.
            using (StreamReader r = new StreamReader(@"C:\LogFile.log"))
            {
                // 2.
                // Read each line until EOF.
                string line;
                while ((line = r.ReadLine()) != null)
                {
                    // 3.
                    // Do stuff with line.
                    if (line.Contains("Files"))
                    {
                        if (!line.Contains("Files : *.*"))
                        {
                            String content = line.ToString();

                            string[] splitContent = System.Text.RegularExpressions.Regex.Replace(content, @"\s+", " ").Split(' ');

                            //foreach (string s in splitContent)
                            //Console.WriteLine(s);
                            Console.WriteLine(splitContent[3]);
                        }                           
                    }                        
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
于 2013-10-17T12:43:55.217 に答える
0

これを試して:

foreach(var section in splitContent)
{
    Console.Write("{0}\t", section);
}
Console.WriteLine();
于 2013-10-17T09:48:12.340 に答える