2014-01-18 15 views
0

По какой-то причине этот метод возвращает файл с нулевыми байтами. Он должен создать файл и вернуть список. Он вернется на консоль, но не будет записываться в файл.Информация не записывается в текстовый файл

Вот на вызов

data.GetStationIDs ("BoulderStations.txt", lat, lon); 

и вот метод

public List<string> GetStationIDs (string filename, string lat, string lon) { 

     //specify file name, instructions, and priveleges 
     FileStream CurrentDataFile = new FileStream (filename, FileMode.OpenOrCreate, FileAccess.Write); 
     //create a new stream to write to the file 
     StreamWriter CurrentData = new StreamWriter (CurrentDataFile); 

     List<string> StationIDList = new List<string>(); 

     string url = @"http://api.wunderground.com/api/" + wundergroundkey + "/geolookup/q/" + lat + "," + lon + ".json"; 
     Uri uri = new Uri(url); 
     WebRequest webRequest = WebRequest.Create(uri); 
     WebResponse response = webRequest.GetResponse(); 
     StreamReader streamReader = new StreamReader(response.GetResponseStream()); 
     String responseData = streamReader.ReadToEnd(); 

     var container = JsonConvert.DeserializeObject<HistoryResponseContainer>(responseData); 

     foreach (var pws in container.location.nearby_weather_stations.pws.station) { 
      CurrentData.Write (pws.id + " " + pws.lat + " " + pws.lon); 
     } 

     foreach (var pws in container.location.nearby_weather_stations.pws.station) { 
      StationIDList.Add(pws.id); 
     } 

     return (StationIDList); 

У меня есть другой способ, в котором тот же подход работает отлично.

public void GetFiveMinuteData(List<String> StationIDList, String Date, String Filename) { 

     //specify file name, instructions, and priveleges 
     FileStream CurrentDataFile = new FileStream (Filename, FileMode.OpenOrCreate, FileAccess.Write); 
     //create a new stream to write to the file 
     StreamWriter CurrentData = new StreamWriter (CurrentDataFile); 

     foreach (String StationID in StationIDList) { 

      string url = @"http://api.wunderground.com/api/" + wundergroundkey + "/history_" + Date + "https://stackoverflow.com/q/pws:" + StationID + ".json"; 
      Uri uri = new Uri (url); 
      WebRequest webRequest = WebRequest.Create (uri); 
      WebResponse response = webRequest.GetResponse(); 
      StreamReader streamReader = new StreamReader (response.GetResponseStream()); 
      String responseData = streamReader.ReadToEnd(); 

      var container = JsonConvert.DeserializeObject<HistoryResponseContainer> (responseData); 

      foreach (var observation in container.history.observations) { 

       CurrentData.Write (StationID + " " + Date + " "); 
       // This makes easier access to the date. not perfect, but better. 
       DateTime date = observation.date.Value; 
       DateTime utc = observation.utcdate.Value; 

       // whatever you want to do with each observation 
       if (date.Minute == 0 || date.Minute % 5 == 0) { 
        CurrentData.Write (date.Hour + ":" + date.Minute + " " + observation.wdird + " " + observation.wspdi); 
       }//end if 

       CurrentData.Write ("\n"); 
      } //End foreach observation 

     } //end foreach station 

     Console.WriteLine ("CurrentDataFile complete!"); 

ответ

1

Эти линии;

//specify file name, instructions, and priveleges 
     FileStream CurrentDataFile = new FileStream (filename, FileMode.OpenOrCreate, FileAccess.Write); 
     //create a new stream to write to the file 
     StreamWriter CurrentData = new StreamWriter (CurrentDataFile); 

не делает то, что вы ожидаете от них. Вы никогда ничего не пишете в файл, и вы никогда не очищаете поток. В дополнение к этому, в вашем коде отсутствуют правильные операторы using. Если вы хотите продолжить использование классов чтения/записи потока, посмотрите на их документы на msdn, у них есть хорошие примеры, которые вы вообще не выполняете.

Другим вариантом было бы упростить вашу проблему и использовать следующее:

File.WriteAllText(aStringWithDataThatIwantInTheFile); 

string fileContents = File.ReadAllText(@"C:\thefilepath.txt"); 

string[] fileLines = File.ReadAllLines(AStringWithMyFilePath); 

File.WriteAllLines(AStringArrayGoesHere); 

К сожалению, я работал бы с текущим кодом, но нет особого смысла, потому что я должен был бы полностью переписать метод, и я понятия не имею, что данные, которые вы на самом деле ожидать, чтобы записать в файл, потому что вы никогда не говорите StreamWriter, который вы выделяете, чтобы написать что-нибудь, вы просто выделите его, а затем перейдете к другим вещам.

+0

Это странно, я использую тот же код в другом методе, и он работает нормально. Я обновлю сообщение, чтобы показать другой метод. –

+1

@WillLuce факт, что ваш другой метод работает, не делает код более правильным. Посмотрите пример на msdn и прочитайте инструкции 'IDisposable' и' using', если вы хотите http://msdn.microsoft.com/en-us/library/system.io.streamwriter(v=vs.110) .aspx 'StreamWriter' реализует' IDisposable', что означает, что вам нужно либо выделить внутри оператора using (что рекомендуется), либо явно вызвать метод 'Dispose' самостоятельно. На самом деле, я фактически не заметил ваши звонки «Write», поэтому вы, по крайней мере, пытаетесь написать, но вы все равно никогда не очищаете поток или не распоряжаетесь им. – evanmcdonnal

+0

Получил это. Спасибо. –

Смежные вопросы