2016-06-23 6 views
1

У меня есть файл csv в том же проекте с действием сборки «Встроенный ресурс». Когда я пытаюсь создать поток с помощью этого файла я получаю следующее сообщение об ошибке:Исключение при создании потока из файла csv

system.io.stream.null.readtimeout threw an exception of type system.invalidoperationexception 

Когда я смочите я ловлю исключение, которое говорит:

Value cannot be null.\r\nParameter name: stream 

Я не уверен, что является причиной этого ? Возможно ли, что по какой-то причине он не собирает мой файл, и поэтому ничто не попадает в поток?

internal static void InsertPropertyDefinitions() 
     { 
      DataTable csvData = null; 

      string[] columnNames = null; 
      int rowCount = 0; 
      string[] streamDataValues = null; 
      try { 
       using (Stream stream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(
        "My csv file path")) 
       { 
        StreamReader streamReader = new StreamReader(stream); 
        while (!streamReader.EndOfStream) 
        { 
         String streamRowData = streamReader.ReadLine().Trim(); 
         if (streamRowData.Length > 0) 
         { 
          streamDataValues = streamRowData.Split(','); 
          if (rowCount == 0) 
          { 
           rowCount = 1; 
           columnNames = streamRowData.Split(','); 
           csvData = new DataTable(); 

           foreach (string csvColumn in columnNames) 
           { 
            DataColumn dataColumn = new DataColumn(csvColumn.ToUpper(), typeof(string)); 

            dataColumn.DefaultValue = string.Empty; 

            csvData.Columns.Add(dataColumn); 
           } 
          } 
          else 
          { 
           DataRow dataRow = csvData.NewRow(); 

           for (int i = 0; i < columnNames.Length; i++) 
           { 
            dataRow[columnNames[i]] = streamDataValues[i] == null ? string.Empty : streamDataValues[i].ToString(); 
           } 

           csvData.Rows.Add(dataRow); 
          } 
         } 
        } 
        streamReader.Close(); 
        streamReader.Dispose(); 

        foreach (DataRow dataRow in csvData.Rows) 
        { 
         string rowValues = string.Empty; 

         foreach (string csvColumn in columnNames) 
         { 
          rowValues += csvColumn + "=" + dataRow[csvColumn].ToString() + "; "; 
         } 
        } 
       } 
      } 
+0

Вы получили тайм-аут чтения. Я попытался бы выяснить, почему произошел тайм-аут. – jdweng

+0

Я думаю, что это исходит из последнего исключения, которое говорит мне, что мой поток равен нулю. – Tim

ответ

2

Try по ResourceName:

var assembly = Assembly.GetExecutingAssembly(); 
var resourceName = "MyCompany.MyProduct.MyFile.csv"; 

using (Stream stream = assembly.GetManifestResourceStream(resourceName)) 
using (StreamReader reader = new StreamReader(stream)) 
{ 
    ... 
} 

Имя ресурса не обязательно совпадает с именем файла. Вы можете проверить с помощью Assembly.GetManifestResourceNames();

Обычно VS добавляет пространство имен к имени ресурса. Тогда MyList.csv -> NS.MyList.csv

Чтобы получить имена

var assembly = System.Reflection.Assembly.GetExecutingAssembly(); 
var lst = assembly.GetManifestResourceNames(); 
Console.WriteLine("Files"); 
Console.WriteLine(string.Join(", ", lst)); 
+0

поток по-прежнему равен нулю – Tim

+0

Пожалуйста, добавьте вывод для Assembly.GetManifestResourceNames(); – Mate

+0

assembly.GetManifestResourceNames \t ошибка CS0428: Невозможно преобразовать группу методов 'GetManifestResourceNames' в объект объекта без делегата. Вы намеревались вызвать метод? – Tim