2016-06-23 11 views
1

Ich habe eine CSV-Datei im selben Projekt mit einer Build-Aktion von "Embedded Resource". Wenn ich versuche, einen Stream zu erstellen, um diese Datei ich die folgende Fehlermeldung erhalten:Ausnahme beim Erstellen eines Streams aus csv-Datei

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

Wenn ich laufen lasse es mir eine Ausnahme zu fangen, der sagt:

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

Ich bin nicht sicher, was dies verursacht ? Ist es möglich, dass es meine Datei aus irgendeinem Grund nicht aufnimmt und somit nichts in den Stream gelangt?

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

Sie haben eine Lese Timeout. Ich würde versuchen herauszufinden, warum die Zeitüberschreitung aufgetreten ist. – jdweng

+0

Ich denke, dass kommt von der letzten Ausnahme, die mir sagt, dass mein Stream null ist. – Tim

Antwort

2

Versuchen von resource:

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

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

Der Ressourcenname ist nicht unbedingt gleich den Namen der Datei. Sie können überprüfen, mit Assembly.GetManifestResourceNames();

In der Regel VS hinzufügen Namespace zu Ressource Name. Dann MyList.csv -> NS.MyList.csv

Um Namen zu bekommen

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

Stream ist immer noch null – Tim

+0

Bitte, fügen Sie output für Assembly.GetManifestResourceNames(); – Mate

+0

assembly.GetManifestResourceNames \t Fehler CS0428: Method-Gruppe 'GetManifestResourceNames' kann nicht in Nicht-Delegate-Typ 'Objekt' konvertiert werden. Wollten Sie die Methode aufrufen? – Tim

Verwandte Themen