2016-06-23 18 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

私のストリームがnullであることを私に伝えている最後の例外から来ていると思っています。 – Tim

答えて

2

てみ 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

関連する問題