如何使用嵌入式资源(文本文件)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) 我正在向要写入的方法发送一个流,在这些方法中我使用的是二进制阅读器/ wrtier.当读取器/写入器被处理时,using或者仅在未被引用时,流也被关闭?
我会发送一个BinaryReader/Writer,但我也在使用StreamReader(也许我应该绕过它.我只使用GetLine和ReadLine).如果每次作家/读者关闭时关闭流,这是非常麻烦的.
我的代码到目前为止
StreamReader reading = File.OpenText("test.txt");
string str;
while ((str = reading.ReadLine())!=null)
{
if (str.Contains("some text"))
{
StreamWriter write = new StreamWriter("test.txt");
}
}
Run Code Online (Sandbox Code Playgroud)
我知道如何找到文本,但我不知道如何用我自己的文件替换文件中的文本.
类如Stream,StreamReader,StreamWriter等工具IDisposable界面.这意味着,我们可以Dispose()在这些类的对象上调用方法.他们还定义了一个public名为的方法Close().现在让我感到困惑的是,一旦我完成了对象,我该怎么称呼?如果我同时打电话怎么办?
我目前的代码是这样的:
using (Stream responseStream = response.GetResponseStream())
{
using (StreamReader reader = new StreamReader(responseStream))
{
using (StreamWriter writer = new StreamWriter(filename))
{
int chunkSize = 1024;
while (!reader.EndOfStream)
{
char[] buffer = new char[chunkSize];
int count = reader.Read(buffer, 0, chunkSize);
if (count != 0)
{
writer.Write(buffer, 0, count);
}
}
writer.Close();
}
reader.Close();
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我编写了using()构造,自动调用Dispose()每个对象的方法.但我也称之为Close()方法.这样对吗?
请告诉我使用流对象时的最佳做法.:-)
MSDN示例不使用using()构造,并且调用 …
标题说明了一切:
我可以确认这两个文件大小相同(以下方法返回true)但我无法再提取副本版本.
我错过了什么吗?
Boolean MyMethod(){
using (StreamReader sr = new StreamReader("C:\...\file.tar.gz")) {
String AsString = sr.ReadToEnd();
byte[] AsBytes = new byte[AsString.Length];
Buffer.BlockCopy(AsString.ToCharArray(), 0, AsBytes, 0, AsBytes.Length);
String AsBase64String = Convert.ToBase64String(AsBytes);
byte[] tempBytes = Convert.FromBase64String(AsBase64String);
File.WriteAllBytes(@"C:\...\file_copy.tar.gz", tempBytes);
}
FileInfo orig = new FileInfo("C:\...\file.tar.gz");
FileInfo copy = new FileInfo("C:\...\file_copy.tar.gz");
// Confirm that both original and copy file have the same number of bytes
return (orig.Length) == (copy.Length);
}
Run Code Online (Sandbox Code Playgroud)
编辑:工作示例更简单(感谢@TS):
Boolean MyMethod(){
byte[] AsBytes = File.ReadAllBytes(@"C:\...\file.tar.gz");
String AsBase64String …Run Code Online (Sandbox Code Playgroud) 我有一个很好的任务,就是如何处理大型文件被加载到我们应用程序的脚本编辑器中(就像我们用于快速宏的内部产品的VBA一样).大多数文件大约300-400 KB,这是很好的加载.但是当它们超过100 MB时,这个过程很难(正如你所期望的那样).
发生的事情是将文件读取并推入RichTextBox然后导航 - 不要过于担心这部分.
编写初始代码的开发人员只是使用StreamReader并且正在执行
[Reader].ReadToEnd()
Run Code Online (Sandbox Code Playgroud)
这可能需要很长时间才能完成.
我的任务是打破这段代码,将其以块的形式读入缓冲区并显示一个带有取消选项的进度条.
一些假设:
现在提问:
这些(在您的专业意见中)是好主意吗?我过去曾经有一些问题从Streams读取内容,因为它总会错过最后几个字节或者其他东西,但如果是这样的话,我会问另一个问题.
我无法将数据发送到网站并在Python中获得响应.我见过类似的问题,但似乎没有一个能达到我的目标.
这是我正在尝试移植到Python的C#代码:
static void Request(Uri selectedUri)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(selectedUri);
request.ServicePoint.BindIPEndPointDelegate = BindIPEndPointCallback;
request.Method = "GET";
request.Timeout = (int)Timeout.TotalMilliseconds;
request.ReadWriteTimeout = (int)Timeout.TotalMilliseconds;
request.CachePolicy = CachePolicy;
request.UserAgent = UserAgent;
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
using (StreamReader responseReader = new StreamReader(response.GetResponseStream()))
{
string responseText = responseReader.ReadToEnd();
File.WriteAllText(UrlFileName, responseText.Trim(), Encoding.ASCII);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我在Python中的尝试:
def request():
web = httplib.HTTPConnection('https://someurl.com');
headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"}
web.request("GET", "/heartbeat.jsp", headers);
response = web.getresponse();
stream = ""; #something is wrong here
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激!
是否有优雅的模拟StreamReader.ReadToEnd方法BinaryReader?也许将所有字节放入一个字节数组?
我这样做:
read1.ReadBytes((int)read1.BaseStream.Length);
Run Code Online (Sandbox Code Playgroud)
......但必须有更好的方法.
我有一些.csv文件,我正在使用它作为测试台的一部分.我可以打开它们并且没有任何问题地阅读它们,除非我已经在Excel中打开了文件,在这种情况下我获得了IOException:
System.IO.IOException:进程无法访问文件'TestData.csv',因为它正由另一个进程使用.
这是测试平台的片段:
using (CsvReader csv = new CsvReader(new StreamReader(new FileStream(fullFilePath, FileMode.Open, FileAccess.Read)), false))
{
// Process the file
}
Run Code Online (Sandbox Code Playgroud)
这是StreamReader的限制吗?我可以在其他应用程序(例如Notepad ++)中打开该文件,因此它不能成为操作系统问题.也许我需要使用其他一些课程?如果有人知道如何绕过这个(除了关闭excel!)我会非常感激.
双方StreamReader并BinaryReader可以用来从二进制文件中的数据(例如)
二进制读取器:
using (FileStream fs = File.Open(@"c:\1.bin",FileMode.Open))
{
byte[] data = new BinaryReader(fs).ReadBytes((int)fs.Length);
Encoding.getstring....
}
Run Code Online (Sandbox Code Playgroud)
StreamReader:
using (FileStream fs = File.Open(@"c:\1.bin",FileMode.Open))
{
using (StreamReader sr = new StreamReader(fs,Encoding.UTF8))
{
var myString=sr.ReadToEnd();
}
}
Run Code Online (Sandbox Code Playgroud)
有什么区别,什么时候应该使用哪个?
streamreader ×10
c# ×7
.net ×6
stream ×4
binaryreader ×2
file ×2
base64 ×1
http ×1
idisposable ×1
io ×1
large-files ×1
python ×1
readonly ×1
streamwriter ×1
webrequest ×1