我已经在SQL 2008服务器上成功设置了FILESTREAM; 但是我注意到即使我删除了包含FILESTREAM数据的行,物理数据文件似乎也没有被删除.
通过物理文件,我指的是SQLServer托管目录中的文件,其唯一的文件名不是添加到dbase的原始文件.
有谁知道SQLServer最终是否会删除该文件?如果从dbase中删除了大量大文件,我希望能够快速回收这些空间.
string abc = "This is a string";
Run Code Online (Sandbox Code Playgroud)
如何将abc加载到FileStream中?
FileStream input = new FileStream(.....);
Run Code Online (Sandbox Code Playgroud) 我需要使用FileStream和下面提到的选项在C#中打开一个文本文件
var fileStream = new FileStream(filePath,
FileMode.Open,
FileAccess.Read,
FileShare.Read, 64 * 1024,
(FileOptions)FILE_FLAG_NO_BUFFERING |
FileOptions.WriteThrough & FileOptions.SequentialScan);
Run Code Online (Sandbox Code Playgroud)
文本文件包含"1"或"0",在获得结果后,我将文本文件的内容分配给字符串变量.如果你感兴趣,我需要上面的选项,以避免Windows从缓存中读取文本文件.
System.IO.File.ReadAllText()
Run Code Online (Sandbox Code Playgroud)
......还不够好.
请有人能够写一个简单的子程序,其中包含了这些要求,因为我到目前为止看到的示例涉及使用字节和缓冲区(此时我真正需要处理的一个区域)并将其保留在.
谢谢
var fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
using(var writer = new StreamWriter(fs))
writer.Write(....);
Run Code Online (Sandbox Code Playgroud)
如果文件以前包含文本并且新写入的文本比文件中已有的文本短,那么如何确保文件中过时的尾随内容被截断?
请注意,在这种情况下,以截断模式打开文件不是一个选项.收到FileStream对象时文件已经打开.上面的代码只是为了说明流的属性.
编辑
扩展下面的答案,解决方案是:
var fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
using(var writer = new StreamWriter(fs))
{
writer.Write(....);
writer.Flush();
fs.SetLength(fs.Position);
}
Run Code Online (Sandbox Code Playgroud) 如何将IFormatProvider传递给StreamWriter?
具体来说我想创建一个
new StreamWriter("myfile.txt", CultureInfo.InvariantCulture);
TextWriter和StringWriter在构造函数中有一个参数,但StreamWriter没有.
属性stringWriter.FormatProvider是readonly.
我可以想到三个似乎不好的解决方案:
有没有办法为StreamWriter指定FormatProvider?如果我可以设置属性,则基于TextWriter的继承,StreamWriter必须具有处理此功能的方法.
[编辑]
感谢@VilleKrumlinde,我修复了一个错误,我在尝试避免代码分析警告时不小心引入了这个错误.我不小心打开了"重叠"文件处理,它不断重置文件长度.现在已修复,您可以FastWrite()多次为同一个流调用而不会出现问题.
[结束编辑]
概观
我正在做一些时序测试,以比较两种不同的方式将结构数组写入磁盘.我相信人们认为,与其他事物相比,I/O成本是如此之高,以至于不值得花太多时间优化其他事情.
但是,我的时间测试似乎表明不是这样.要么我犯了一个错误(这是完全可能的),要么我的优化确实非常重要.
历史
首先是一些历史记录:此FastWrite()方法最初是在几年前编写的,用于支持将结构写入遗留C++程序所使用的文件,我们仍然将其用于此目的.(还有一个相应的FastRead()方法.)它的编写主要是为了更容易将blittable结构数组写入文件,其速度是次要问题.
不止一个人告诉我,这样的优化并不比使用a更快BinaryWriter,所以我终于咬了一口子并进行了一些时序测试.结果让我感到惊讶......
这似乎是我的FastWrite()方法是30 -比同等使用快50倍BinaryWriter.这看起来很荒谬,所以我在这里发布我的代码,看看是否有人能找到错误.
系统规范
结果
我的结果是:
SlowWrite() took 00:00:02.0747141
FastWrite() took 00:00:00.0318139
SlowWrite() took 00:00:01.9205158
FastWrite() took 00:00:00.0327242
SlowWrite() took 00:00:01.9289878
FastWrite() took 00:00:00.0321100
SlowWrite() took 00:00:01.9374454
FastWrite() took 00:00:00.0316074
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,这似乎表明FastWrite()该运行速度提高了50倍.
这是我的测试代码.运行测试后,我做了这两个文件的二进制比较来验证它们确实是相同的(即FastWrite()和SlowWrite()生产相同的文件).
看看你能做些什么.:)
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using …Run Code Online (Sandbox Code Playgroud) 在过去,我总是使用FileStream对象来写或重写整个文件,之后我会立即关闭流.但是,现在我正在开发一个程序,我想在其中保持FileStream打开,以便允许用户在两次保存期间保持对文件的访问.(见我之前的问题).
我正在使用XmlSerializer将我的类序列化为from和XML文件.但是现在我保持FileStream打开,以便稍后用于保存(重新序列化)我的类实例.如果我重复使用相同的文件流而不是使用新的文件流,是否需要进行任何特殊考虑?我是否需要在保存之间将流重置为开头?如果稍后保存的大小比以前的保存小,那么FileStream将保留旧文件中的剩余字节,从而创建一个损坏的文件?我是否需要做一些事情来清除文件,以便它表现得好像我每次都在写一个全新的文件?
如何使用vb.NET或C#下载PDF并存储到磁盘?
URL(PDF)在达到最终PDF之前会进行一些重做.
我试过以下但是当我尝试在本地打开时,PDF似乎已损坏,
Dim PdfFile As FileStream = File.OpenWrite(saveTo)
Dim PdfStream As MemoryStream = GetFileStream(pdfURL)
PdfStream.WriteTo(PdfFile)
PdfStream.Flush()
PdfStream.Close()
PdfFile.Flush()
PdfFile.Close()
Run Code Online (Sandbox Code Playgroud) 我需要一种非常便宜的方法来读取Python中没有终止字符串(流)的缓冲区.这就是我所拥有的,但它耗费了大量的CPU时间和精力.因为它经常"尝试和捕捉".我真的需要一种新的方法.
这是我的代码的简化工作版本:
#! /usr/bin/env/ python
import fcntl, os, sys
if __name__ == "__main__":
f = open("/dev/urandom", "r")
fd = f.fileno()
fl = fcntl.fcntl(fd, fcntl.F_GETFL)
fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK)
ready = False
line = ""
while True:
try:
char = f.read()
if char == '\r':
continue
elif char = '\n':
ready = True
else:
line += char
except:
continue
if ready:
print line
Run Code Online (Sandbox Code Playgroud)
不要在终端中运行它.这只是为了说明."urandom"将破坏你的终端,因为它会吐出很多随机字符,终端模拟器无论解释什么(可以改变你当前的shell设置,标题等).我正在读取通过usb连接的gps.
问题:这可以使用100%的CPU使用率.我试过这个:
#! /usr/bin/env/ python
import fcntl, os, sys
if __name__ == …Run Code Online (Sandbox Code Playgroud) 执行异步I/O的旧.Net方式FileStream是使用FileStream.BeginRead()和FileStream.EndRead().
状态的MSDN文档FileStream.BeginRead():
FileStream提供两种不同的操作模式:同步I/O和异步I/O. 虽然可以使用其中任何一种,但底层操作系统资源可能仅允许以这些模式之一进行访问.
默认情况下,FileStream会同步打开操作系统句柄.在Windows中,这会降低异步方法的速度.如果使用异步方法,请使用FileStream(String,FileMode,FileAccess,FileShare,Int32,Boolean)构造函数.
在.Net 4.5x对执行异步I/O的方式FileStream是使用Stream.ReadAsync().
MSDN文档FileStream.ReadAsync()直接链接到文档的链接Stream.ReadAsync().本文档未提及在异步模式下打开文件的任何需要; 实际上,文档中的示例代码显然没有这样做.
因此,我假设在使用时File.ReadAsync()不需要以异步模式打开文件.
这个假设是否正确?
[编辑]
我刚刚发现了一篇关于使用Async for File Access的MSDN文章.
这表明:
本主题中的示例使用FileStream类,该类具有导致在操作系统级别发生异步I/O的选项.通过使用此选项,您可以避免在许多情况下阻止ThreadPool线程.
要启用此选项,请在构造函数调用中指定useAsync = true或options = FileOptions.Asynchronous参数.
所以,现在我在想,我应该可以打开该文件在异步模式......如果是这样,这是有点遗憾的是,在文档中提供的示例代码ReadAsync()并不能打开该文件异步!
filestream ×10
c# ×7
.net ×2
streamwriter ×2
async-await ×1
beginread ×1
blob ×1
cultureinfo ×1
download ×1
file-io ×1
io ×1
optimization ×1
pdf ×1
python ×1
sql ×1
vb.net ×1