我将文件分几个部分发送给SqlFileStream。如下所示:
public void StreamFile(int storageId, Stream stream)
{
var select = string.Format(
@"Select TOP(1) Content.PathName(),
GET_FILESTREAM_TRANSACTION_CONTEXT() FROM FileStorage WHERE FileStorageID={0}",
storageId);
using (var conn = new SqlConnection(this.ConnectionString))
{
conn.Open();
var sqlTransaction = conn.BeginTransaction(IsolationLevel.ReadCommitted);
string serverPath;
byte[] serverTxn;
using (var cmd = new SqlCommand(select, conn))
{
cmd.Transaction = sqlTransaction;
using (SqlDataReader rdr = cmd.ExecuteReader())
{
rdr.Read();
serverPath = rdr.GetSqlString(0).Value;
serverTxn = rdr.GetSqlBinary(1).Value;
rdr.Close();
}
}
this.SaveFile(stream, serverPath, serverTxn);
sqlTransaction.Commit();
}
}
private void SaveFile(Stream clientStream, string serverPath, byte[] serverTxn)
{
const int BlockSize = 512;
using (var dest = new SqlFileStream(serverPath, serverTxn,
FileAccess.ReadWrite, FileOptions.SequentialScan, 0))
{
var buffer = new byte[BlockSize];
int bytesRead;
dest.Seek(dest.Length, SeekOrigin.Begin);
while ((bytesRead = clientStream.Read(buffer, 0, buffer.Length)) > 0)
{
dest.Write(buffer, 0, bytesRead);
}
}
clientStream.Close();
}我试着上传10部分文件。当我查找文件夹在哪里保存数据时,我看到了10个文件。对于每一个额外的部分,SqlFilesStream创建一个新的文件。最后一个文件保存了所有数据,但rest文件不必要地浪费了空间。是否可以将所有数据保存在一个文件-最后一个附加操作中?
发布于 2014-03-20 18:33:53
SqlFileStream不支持“部分更新”。每次内容更改时,都会将一个新文件写入磁盘。这些额外的文件将被取消引用,最终将被清理,但在此之前,它们将影响您的备份/日志/等等。
如果要将所有数据放在一个文件中,则需要在单个流中处理整个文件。
如果您不需要支持大型文件(>2GB),并且需要进行大量的小部分更新,那么最好将文件存储在VARBINARY(MAX)列中。
https://stackoverflow.com/questions/20928281
复制相似问题