如何使用嵌入式资源(文本文件)StreamReader并将其作为字符串返回?我当前的脚本使用Windows窗体和文本框,允许用户查找和替换未嵌入的文本文件中的文本.
private void button1_Click(object sender, EventArgs e)
{
StringCollection strValuesToSearch = new StringCollection();
strValuesToSearch.Add("Apple");
string stringToReplace;
stringToReplace = textBox1.Text;
StreamReader FileReader = new StreamReader(@"C:\MyFile.txt");
string FileContents;
FileContents = FileReader.ReadToEnd();
FileReader.Close();
foreach (string s in strValuesToSearch)
{
if (FileContents.Contains(s))
FileContents = FileContents.Replace(s, stringToReplace);
}
StreamWriter FileWriter = new StreamWriter(@"MyFile.txt");
FileWriter.Write(FileContents);
FileWriter.Close();
}
Run Code Online (Sandbox Code Playgroud) StreamWriter.Close()表示它还会关闭StreamWriter的底层流.那么StreamWriter.Dispose呢?Dispose是否也处置和/或关闭底层流
新的Visual Studio 2012抱怨我一直使用的常见代码组合.我知道这似乎有点矫枉过正,但我在我的代码中做了以下'只是为了确定'.
using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
using (var sr = new StreamReader(fs))
{
// Code here
}
}
Run Code Online (Sandbox Code Playgroud)
Visual Studio正警告我,我不止一次处理fs.所以我的问题是这样,写这个的正确方法是:
using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
var sr = new StreamReader(fs);
// do stuff here
}
Run Code Online (Sandbox Code Playgroud)
或者我应该这样做(或者没有提到的其他变体).
var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
using (var sr = new StreamReader(fs))
{
// Code here
}
Run Code Online (Sandbox Code Playgroud)
我在StackOverflow中搜索了几个问题,但没有找到直接解决此组合的最佳实践的问题.
谢谢!
我试过这个: 读取请求正文两次 ,这个:https : //github.com/aspnet/Mvc/issues/4962 但没有用。我这样阅读请求正文:
app.Use(async (context, next) =>
{
var requestBody = await ReadStream(context.Request.Body);
var requestPath = context.Request.Path.ToString();
//Do some thing
await next.Invoke();
var responseStatusCode = context.Response.StatusCode;
//Do some other thing
});
private async Task<string> ReadStream(Stream stream)
{
using (var streamReader = new StreamReader(stream))
{
var result = await streamReader.ReadToEndAsync();
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
在控制器中,我得到“处置对象”或“空流”。
我正在努力确保我的编码遵循正确的对象处理方式,因此我将这些规则强制执行为错误.但我在使用这段代码时遇到了麻烦
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Xml;
class MyClass
{
public String ToXml()
{
var objSerializer =
new DataContractSerializer(GetType());
var objStream = new MemoryStream();
StreamReader objReader;
String strResult;
try
{
// Serialize the object
objSerializer.WriteObject(objStream, this);
// Move to start of stream to read out contents
objStream.Seek(0, SeekOrigin.Begin);
objReader = new StreamReader(objStream);
try
{
// Read Contents into a string
strResult = objReader.ReadToEnd();
}
finally
{
objReader.Dispose();
}
}
finally
{
if (objStream != null)
{
// objStream.Dispose(); …Run Code Online (Sandbox Code Playgroud) 如果我有这样的嵌套对象的代码,我是否需要使用嵌套的using语句来确保SQLCommand和SQLConnection对象都正确处理,如下所示,或者如果实例化SQLCommand的代码在外部使用声明.
using (var conn = new SqlConnection(sqlConnString))
{
using (var cmd = new SqlCommand())
{
cmd.CommandType = CommandType.Text;
cmd.CommandText = cmdTextHere;
conn.Open();
cmd.Connection = conn;
rowsAffected = cmd.ExecuteNonQuery();
}
}
Run Code Online (Sandbox Code Playgroud) 这个问题描述了与CA2202相同的场景,如何解决这种情况,但它不是关于如何修复代码,而是关于为什么首先出现问题.
以下代码:
using (Stream stream = obtainStreamObject())
{
using (var reader = new XmlTextReader(stream))
{
//do something with XmlTextReader
}
}
Run Code Online (Sandbox Code Playgroud)
原因Stream.Dispose()叫两次.首先,内部using块会崩溃,这会调用XmlTextReader.Dispose()哪些调用Stream.Dispose().然后外部using块崩溃并Stream.Dispose()再次被调用.
所以,我必须换Stream到using,但不换行XmlTextReader到using,尽管他们都实现IDisposable.
这会产生CA2202警告
不要多次处理对象对象'stream'可以在方法'MethodName(whatever)'中多次处理.为避免生成System.ObjectDisposedException,不应在对象上多次调用Dispose.
好吧,它说第二个Dispose()可能会屈服ObjectDisposedException.这有什么意义?为什么我会这样实现Dispose(),当它第二次被调用它会抛出异常而不是什么都不做?
在我问之前我只是想说我已经看了这个,我只是想不出来.
所以我有一个Web调用返回一个我需要拆分的令人难以置信的长字符串.我想使用textfieldparser,但我不想将此字符串保存为文件,textfieldparser似乎是关于文件或...流,我不理解流.那么我如何将字符串输入到此?我可以将它转换为流吗?我意识到这可能非常简单,所以我为我的无知而道歉.
非常感谢您的帮助!
当创建一个实现一个元素IDisposable,Dispose()是在结束所谓的using块还,如果抛出一个异常,如果我是正确的.
但是,在ClassB一次性元素的构造函数中创建新元素时,如果IDisposable实现了ClassB的对象,是否也会被处置?
using (ClassA a = new ClassA(new ClassB()))
{
}
Run Code Online (Sandbox Code Playgroud)
这可能适用于与之相关的类Stream.但是,这一般适用吗?
c# ×7
.net ×6
idisposable ×3
dispose ×1
middleware ×1
stream ×1
streamreader ×1
string ×1
stylecop ×1
using ×1
vb.net ×1