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 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
создает новый файл. Последний файл содержит все данные, но остальные файлы излишне потрачены впустую. Возможно ли хранить все данные в одном файле - последняя операция добавления?
1 ответ
SqlFileStream не поддерживает "частичные обновления". Каждый раз, когда содержимое меняется, новый файл записывается на диск. Эти дополнительные файлы не имеют ссылок и в конечном итоге будут очищены, но до тех пор, пока они не будут, они будут влиять на ваши резервные копии / журналы / и т.д.
Если вам нужны все данные в одном файле, вам нужно будет обработать весь файл в одном потоке.
Если вам не нужно поддерживать большие файлы ( > 2 ГБ) и вы ожидаете много небольших частичных обновлений, лучше вместо этого хранить файл в столбце VARBINARY(MAX).