[英]Where should my using statements go? And where to place the try catch?
我剛剛開始使用文件流,盡管我使代碼正常工作,但我也很想讓它變得漂亮:)我不知道在哪里放置using語句,因此可以跳過stream.Close(),以及最后如何使用try catch。 這是我的代碼,不是最漂亮的東西,但是可以。 雙文件流用於清除文件。
編輯:很抱歉發布的代碼片段臉紅很糟糕:P我已經發布了第二次嘗試:)
internal static void SaveFileAsTxt()
{
FileStream streamer = new FileStream("Shipping2.txt", FileMode.Append, FileAccess.Write, FileShare.Write);
streamer.Close();
FileStream f = File.Open("Shipping2.txt", FileMode.Create);
f.Close();
StreamWriter writer = new StreamWriter("Shipping2.txt", true, Encoding.ASCII);
foreach (var shipment in _shipments)
{
string write = (shipment.Distance + ","+ shipment.Distance).ToString();
writer.WriteLine(write);
};
writer.Close();
}
//--------new code--------
internal static void SaveFileAsTxt()
{
if (File.Exists("Shipping2.txt"))
{
File.Delete("Shipping2.txt");
}
using (StreamWriter writer = new StreamWriter("Shipping2.txt", true, Encoding.ASCII))
{
foreach (var shipment in _shipments)
{
string write = (shipment.Duration + ","+ shipment.Distance).ToString();
writer.WriteLine(write);
}
}
}
您不需要多次打開文件-實際上,您實際上一次打開了三次 。 這應該沒問題; File.CreateText
將截斷該文件(如果已存在),否則創建該文件:
// Are you *sure* you want to use ASCII? UTF-8 might be a better bet...
using (TextWriter writer = File.CreateText("Shipping2.txt", Encoding.ASCII))
{
foreach (var shipment in _shipments)
{
// Removed redundant ToString call, and elided local variable.
// Consider using a format string instead:
// writer.WriteLine("{0},{1}", shipment.Distance, shipment.Distance);
writer.WriteLine(shipment.Distance + "," + shipment.Distance);
}
// Removed empty statement (trailing semi-colon)
}
現在,您說要使用try / catch / finally-但是為什么呢? 如果您無法寫入文件,您肯定要用這種方法“處理”異常,而不是讓氣泡冒泡給調用者嗎?
您可以跳過前兩個FileStreams
而僅使用StreamWriter
,它將為您創建一個文件:
// Single using
using (StreamWriter writer = new StreamWriter(
"Shipping2.txt",
true, // !!!
Encoding.ASCII))
{
foreach (var shipment in _shipments)
{
string write = (shipment.Distance + "," + shipment.Distance)
.ToString();
writer.WriteLine(write);
}
}
public StreamWriter(
string path,
bool append,
Encoding encoding
)
附加
類型:System.Boolean確定是否將數據附加到文件。 如果文件存在且append為false,則該文件將被覆蓋。 如果文件存在並且append為true,則將數據附加到文件中。 否則,將創建一個新文件 。
編輯:關於更新的問題(第二部分)
您不需要手動刪除文件,只需在StreamWriter
構造函數中指定append = false,它將覆蓋文件:
如果文件存在並且append為false,則文件將被覆蓋
首先,我不了解這么多流的用法,但是您可以在許多地方使用use:
internal static void SaveFileAsTxt()
{
using(var streamer = new FileStream("Shipping2.txt", FileMode.Append, FileAccess.Write, FileShare.Write))
{
}
using(var f = File.Open("Shipping2.txt", FileMode.Create))
{
}
using(var writer = new StreamWriter("Shipping2.txt", true, Encoding.ASCII))
{
foreach (var shipment in _shipments)
{
string write = (shipment.Distance + ","+ shipment.Distance).ToString();
writer.WriteLine(write);
};
}
}
現在,您擁有的代碼與此等效:
internal static void SaveFileAsTxt() {
using (FileStream streamer = new FileStream(
"Shipping2.txt", FileMode.Append, FileAccess.Write, FileShare.Write
);) {}
using(FileStream f = File.Open("Shipping2.txt", FileMode.Create)) {}
using(StreamWriter writer =
new StreamWriter("Shipping2.txt", true, Encoding.ASCII)) {
foreach (var shipment in _shipments) {
string write = (shipment.Distance + "," + shipment.Distance).ToString();
writer.WriteLine(write);
}
}
}
但是我不知道你為什么打開第一個文件。
關於第二個,我相信您嘗試使用此方法創建文件,
但是還有其他方法可以做到這一點。
只是有所不同,我將使用LINQ :-)
File.WriteAllLines(
"Shipping2.txt",
_shipments.Select(
p => string.Format(
"{0},{1}",
shipment.Distance,
shipment.Distance)
),
Encoding.ASCII);
此版本需要.NET 4.0。 File.WriteAllLines
將創建文件,寫入所有行並關閉文件。 _shipments.Select(p => string.Format("{0},{1}", shipment.Distance, shipment.Distance))
_shipments
, _shipments
_shipments.Select(p => string.Format("{0},{1}", shipment.Distance, shipment.Distance))
將為_shipments
每個元素返回一個包含_shipments
shipment.Distance + "," + shipment.Distance
的字符串shipment.Distance + "," + shipment.Distance
(格式化使用string.Format
)`
// Single using
using (StreamWriter writer = new StreamWriter(
"Shipping2.txt",
true, // !!!
Encoding.ASCII))
{
foreach (var shipment in _shipments)
{
string write = (shipment.Distance + "," + shipment.Distance)
.ToString();
writer.WriteLine(write);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.