Tag: filestream

使用临时文件流进行处理

假设我想定义一个使用Path.GetTempFileName()方法创建临时文件的TempFileStream类。 当不再需要TempFileStream的对象时,必须删除临时文件,例如关闭或处置: class TempFileStream: FileStream { string m_TempFileName = Path.GetTempFileName(); public TempFileStream(FileMode fileMode): base(m_TempFileName,fileMode) {} /// … public ovverride Dispose(bool disposing) { /// ??? } } 我该如何简单安全地实现这一点?

使用SqlFileStream从WCF服务返回流

我有一个WCF服务,用户可以从中请求大型数据文件(存储在启用了FileStream的SQL数据库中)。 这些文件应该流式传输,并且在发送之前不会加载到内存中。 所以我有以下方法应该返回一个由WCF服务调用的流,以便它可以将Stream返回给客户端。 public static Stream GetData(string tableName, string columnName, string primaryKeyName, Guid primaryKey) { string sqlQuery = String.Format( “SELECT {0}.PathName(), GET_FILESTREAM_TRANSACTION_CONTEXT() FROM {1} WHERE {2} = @primaryKey”, columnName, tableName, primaryKeyName); SqlFileStream stream; using (TransactionScope transactionScope = new TransactionScope()) { byte[] serverTransactionContext; string serverPath; using (SqlConnection sqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings[“ConnString”].ToString())) { sqlConnection.Open(); using (SqlCommand sqlCommand […]

为什么Code Analysis告诉我,“不要多次丢弃对象”:

在这段代码上: public static string Base64FromFileName(string fileName) { try { FileInfo fInfo = new FileInfo(fileName); long numBytes = fInfo.Length; FileStream fStream = new FileStream(fileName, FileMode.Open, FileAccess.Read); BinaryReader br = new BinaryReader(fStream); byte[] bdata = br.ReadBytes((int)numBytes); br.Close(); fStream.Close(); return Convert.ToBase64String(bdata); } catch(Exception e) { throw e; } } …我得到了Visual Studio的代码分析工具,警告,“ 不要多次丢弃对象……为了避免生成System.ObjectDisposedException,你不应该在对象上多次调用Dispose ” fStream.Close();” 线。 为什么? fStream是否在上面的行中,BinaryReader关闭了? 无论如何我不会更好地重构它: […]

如何正确打开FileStream以与XDocument一起使用

我想使用Linq2XML将一些节点附加到xml文档。 有问题的文件正由其他进程使用,他们应该能够在我更新文件时读取该文件。 所以我提出了这个解决方案,这显然不是正确的方法(方法doc.Save()失败并说另一个进程正在使用该文件): using (FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.ReadWrite, FileShare.Read)) { doc = XDocument.Load(new StreamReader(fs)); doc.Root.Add(entry); doc.Save(filename); fs.Close(); } 任何帮助都非常有用。

using子句会关闭此流吗?

我显然已经习惯了一个糟糕的编码习惯。 以下是我编写的代码示例: using(StreamReader sr = new StreamReader(File.Open(“somefile.txt”, FileMode.Open))) { //read file } File.Move(“somefile.txt”, “somefile.bak”); //can’t move, get exception that I the file is open 我认为因为using子句在StreamReader上显式调用了Close()和Dispose() , FileStream也会关闭。 我能解决问题的唯一方法是将上面的块更改为: using(FileStream fs = File.Open(“somefile.txt”, FileMode.Open)) { using(StreamReader sr = new StreamReader(fs)) { //read file } } File.Move(“somefile.txt”, “somefile.bak”); // can move file with no errors 是否应该通过在第一个块中处理关闭StreamReader来关闭底层的FileStream ? […]

空路径名称不合法

所以我正在尝试编译一个Asteroids游戏。 它几乎正常工作,所有文件都已到位等等…… 当它遇到这个代码时会出现问题。 FileStream myFileStream = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read); string myTempFile = @”F:\Documents\Junior School\Computer Programming (Java 1)\AsteroidsWithSound\AsteroidsWithSound\temp\mysound” + i.ToString() + “.wav”; 它给了我一个错误/警告,不知道究竟它叫什么,但它说 ArgumentException未处理。 空路径名称不合法。 我在网上看过这样的代码块导致了这个问题但却找不到解决方案。 任何帮助都是极好的。 编辑:文件名在此块中定义。 string filename = this.Player.FileName; this.Player.Open(“”); File.Delete(filename); this.isReady = true;

Filestream.Read的返回值是什么意思? 如何以块的forms读取数据并进行处理?

我对C#很新,所以请耐心等待。 我正在读取(使用FileStream)数据(固定大小)到小数组,处理数据然后再读取,依此类推到文件末尾。 我想过用这样的东西: byte[] data = new byte[30]; int numBytesToRead = (int)fStream.Length; int offset = 0; //reading while (numBytesToRead > 0) { fStream.Read(data, offset, 30); offset += 30; numBytesToRead -= 30; //do something with the data } 但我检查了文档及其示例,他们表示上述读取方法的返回值为: “类型:System.Int32读入缓冲区的总字节数。如果该字节数当前不可用 ,则可能小于请求的字节数,如果到达流末尾则为零。” 它们目前不可用是什么意思,这在读取少量数据时是否真的会发生,或者这只是大量数据? 如果只是为了大,大约有多大,因为我也会在其他地方阅读更大的块。 如果这种情况随时可能发生,我应该如何更改代码,以便代码仍能有效执行? 谢谢你的时间和答案。

当文件被锁定时,模拟等待文件。在C#中打开

基本上,我和这张海报有同样的问题,但是在C#中: 等待文件可以用Win32读取 更多信息:我们的代码在我们的一个项目中调用File.Open ,当文件已被另一个进程( EDIT:或线程)打开时偶尔会死掉: FileStream stream = File.Open(m_fileName, m_mode, m_access); /* do stream-type-stuff */ stream.Close(); File.Open将抛出一个IOException (当前正在某处悄悄吞下),其HResult属性为0x80070020 ( ERROR_SHARING_VIOLATION )。 我想做的是: FileStream stream = null; while (stream == null) { try { stream = File.Open(m_fileName, m_mode, m_access, FileShare.Read); } catch (IOException e) { const int ERROR_SHARING_VIOLATION = int(0x80070020); if (e.HResult != ERROR_SHARING_VIOLATION) throw; else […]

我在使用FileStream.ReadAsync()时应该以异步模式打开文件吗?

为FileStream执行异步I / O的旧.Net方法是使用FileStream.BeginRead()和FileStream.EndRead() 。 FileStream.BeginRead()的MSDN文档指出: FileStream提供两种不同的操作模式:同步I / O和异步I / O. 虽然可以使用其中任何一种,但底层操作系统资源可能仅允许以这些模式之一进行访问。 默认情况下,FileStream会同步打开操作系统句柄。 在Windows中,这会降低异步方法的速度。 如果使用异步方法,请使用FileStream(String,FileMode,FileAccess,FileShare,Int32,Boolean)构造函数。 为FileStream执行异步I / O的.Net 4.5x方法是使用Stream.ReadAsync() 。 FileStream.ReadAsync()的MSDN文档直接链接到Stream.ReadAsync()的文档。 本文档未提及是否需要以异步模式打开文件; 实际上,文档中的示例代码显然不会这样做。 因此,我假设在使用File.ReadAsync() ,无需以异步模式打开文件。 这个假设是否正确? [编辑] 我刚刚发现了一篇关于使用Async for File Access的MSDN文章 。 这表明: 本主题中的示例使用FileStream类,该类具有导致在操作系统级别发生异步I / O的选项。 通过使用此选项,您可以避免在许多情况下阻止ThreadPool线程。 要启用此选项,请在构造函数调用中指定useAsync = true或options = FileOptions.Asynchronous参数。 所以现在我认为我应该以异步模式打开文件…如果是这样,有点不幸的是, ReadAsync()文档中提供的示例代码不会异步打开文件!

如何在C#.Net中打开或启动PDF文件?

如何在C#应用程序中以编程方式在其自己的进程中启动PDF? 原来:当我点击C#.Net中的按钮时,我想打开PDF文件?