2014-01-04 6 views
0

Я отправляю файл на 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 не поддерживает «частичные обновления». Каждый раз, когда содержимое изменяется, на диск записывается новый файл. Эти дополнительные файлы де-ссылку и в конечном итоге будут очищены, но до тех пор, пока они не окажутся, они повлияют на ваши резервные копии/журналы/etc

Если вы хотите, чтобы все данные в одном файле, вам необходимо обработать весь файл в одном потоке.

Если вам не нужно поддерживать большие файлы (> 2 ГБ), и вы ожидаете большого количества небольших частичных обновлений, вам может быть лучше сохранить файл в столбце VARBINARY (MAX).

Смежные вопросы