Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SqlFileStream追加新数据创建新文件_C#_Asp.net_Sql Server_Sqlfilestream - Fatal编程技术网

C# SqlFileStream追加新数据创建新文件

C# SqlFileStream追加新数据创建新文件,c#,asp.net,sql-server,sqlfilestream,C#,Asp.net,Sql Server,Sqlfilestream,我将文件分部分发送到SqlFileStream。像这样: public void StreamFile(int storageId, Stream stream) { var select = string.Format( @"Select TOP(1) Content.PathName(), GET_FILESTREAM_TRANSACTION_CONTEXT() FROM FileStorage WHERE File

我将文件分部分发送到
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个文件。对于每个附加部分
sqlfilestream
创建一个新文件。保存除rest文件以外的所有数据的最后一个文件不必要地浪费了空间。是否可以将所有数据保存在一个文件中?最后一次追加操作?

SqlFileStream不支持“部分更新”。每次内容更改时,都会向磁盘写入一个新文件。这些额外的文件将被取消引用,最终将被清理,但在清理之前,它们将影响您的备份/日志等

如果希望将所有数据放在单个文件中,则需要在单个流中处理整个文件


如果您不需要支持大文件(>2 GB),并且需要大量的小部分更新,那么最好将文件存储在VARBINARY(MAX)列中。

这是我希望通过使用filestream从image/VARBINARY(MAX)转换到VARBINARY(MAX)来克服的一个缺点。来自web客户端的分块传输需要断开连接的追加,直到文件被标记为“完全传输”,这种情况很难适应。我通过上传到另一个只包含此类部分临时上传的表来解决这个问题,如果上传成功完成,我们将
插入到filestreamed表中并清理temp。