2013-07-23 43 views
3

我试图写一些信息到一个文本文件,但第二排线之间进行空间设置文本格式表,合并每行两行成一个

代码:

private void CreateDriversList() 
{ 
    StreamWriter w = new StreamWriter(contentDirectory + "\\" + "Drivers.txt"); 
    w.WriteLine("Module Name Display Name   Driver Type Link Date"); 
    w.WriteLine("============ ====================== ============= ======================"); 
    //Declare, Search, and Get the Properties in Win32_SystemDriver 
    System.Management.SelectQuery query = new System.Management.SelectQuery("Win32_SystemDriver"); 
    System.Management.ManagementObjectSearcher searcher = new System.Management.ManagementObjectSearcher(query); 
    foreach (System.Management.ManagementObject ManageObject in searcher.Get()) 
    { 
     w.WriteLine(ManageObject["Name"].ToString()); 
     w.WriteLine("    " + ManageObject["DisplayName"].ToString()); 
    } 
    w.Close(); 
} 

一旦我添加了一行:

w.WriteLine("    " + ManageObject["DisplayName"].ToString()); 

在文本文件中的结果是这样的:

Module Name Display Name   Driver Type Link Date 
============ ====================== ============= ====================== 
1394ohci 
      1394 OHCI Compliant Host Controller 
3ware 
      3ware 
ACPI 
      Microsoft ACPI Driver 
acpiex 
      Microsoft ACPIEx Driver 
acpipagr 

之前,我加入该行的文本文件是这样的:

Module Name Display Name   Driver Type Link Date 
============ ====================== ============= ====================== 
1394ohci 
3ware 
ACPI 
acpiex 
acpipagr 
AcpiPmi 

我只是想现在添加的显示名称列,所以我加入空格所以该行将在显示名称开始,但随后其增加空间在行之间。

我该怎么解决呢?

**

最终文本文件应该是这样的:

Module Name Display Name   Driver Type Link Date    
============ ====================== ============= ====================== 
1394ohci  1394 OHCI Compliant Ho Kernel  7/26/2012 5:26:46 AM 
3ware  3ware     Kernel  3/8/2012 10:33:45 PM 
ACPI   Microsoft ACPI Driver Kernel  9/20/2012 9:09:16 AM 
acpiex  Microsoft ACPIEx Drive Kernel  7/26/2012 5:25:57 AM 
acpipagr  ACPI Processor Aggrega Kernel  7/26/2012 5:27:16 AM 
AcpiPmi  ACPI Power Meter Drive Kernel  7/26/2012 5:27:33 AM 
acpitime  ACPI Wake Alarm Driver Kernel  7/26/2012 5:27:37 AM 

和显示名称行中,也许也是在moudle名行以确保名称将在一行全名。

例如在显示名称:1394兼容OHCI何 应该是:1394兼容OHCI主机控制器

**

Module Name Display Name   Driver Type Link Date 
============ ====================== ============= ====================== 
1394ohci  1394 OHCI Compliant Host Controller 
3ware  3ware 
ACPI   Microsoft ACPI Driver 
acpiex  Microsoft ACPIEx Driver 
acpipagr  ACPI Processor Aggregator Driver 
AcpiPmi  ACPI Power Meter Driver 

回答

4

你已经在你的循环调用WriteLine两次 - 所以它增加了两个每个项目的行数。您只需要添加一个一行,例如,

w.WriteLine("{0} {1}", ManageObject["Name"], ManageObject["DisplayName"]); 

,虽然不会垫的空间,所以你需要包括在composite format string对准方面。你想左填充,所以你需要一个负的取向,它看起来像你想的空间前12个字符,所以:

w.WriteLine("{0,-12} {1}", ManageObject["Name"], ManageObject["DisplayName"]); 
+0

乔恩斯基特现在您的解决方案的工作我已经移动职称驱动程序类型和链接日期更多的权利,以及如何添加更多的字符到驱动程序类型和链接日期的下一行?例如{1,-7}?我更新了我的问题,看看现在文本文件的样子。 –

+0

@HaimKashi:如果您需要将所有*值填入,您需要首先计算出最大长度。如果你有一个最大长度的开始,那会让生活更轻松。但对于匹配的东西,我认为现在是您自己做更多研究的好主意,而不是仅仅为您提供解决方案。如果您按照指向复合格式字符串的MSDN文章的链接,那么您会在其中找到大量信息。 –

3

使用WriteLine总是会追加一个新行字符,所以一个简单的解决方案是使用改为Write。您可以使用PadRight固定宽度的第一场,直到它的大小合适:

w.Write(ManageObject["Name"].ToString().PadRight(13, ' ')); 
w.WriteLine(ManageObject["DisplayName"]); 

但对于一个更好的解决方案,以固定每个字段的宽度,我建议使用一个格式化字符串代替:

w.WriteLine("{0,-12} {1}", ManageObject["Name"], ManageObject["DisplayName"]); 

{0,x}语法只会将字符填充到输入参数的末尾。如果它们太长,它不会截断它们。如果DisplayName长于列的分配空间,这可能会导致一些问题。您可以使用String.Remove将字符串截断为适当的长度。最终完整的代码会是这个样子:

w.WriteLine("{0,-12} {1,-22} {2,13}, {3,22:M/d/yyyy h:mm:ss tt}", 
    ManageObject["Name"].ToString().Remove(12),  // Truncate to 12 chars 
    ManageObject["DisplayName"].ToString().Remove(22), // Truncate to 22 chars 
    ManageObject["DriverType"].ToString().Remove(13), // Truncate to 13 chars 
    ManageObject["LinkDate"]      // No need to truncate here 
);