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

您只需要选择数组中的第二项,即

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位于索引处的列10作为标签列)。


您甚至可以在这里使用 emum 来提高可读性,例如

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

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

或使用 aconst来避免演员表

const int TotalCol = 1;

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

试试这个:

foreach(var section in splitContent)
{
    Console.Write("{0}\t", section);
}
Console.WriteLine();
于 2013-10-17T09:48:12.340 回答
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 回答