2015-04-27 80 views
-1

我想使用curl從多個部分同時使用多線程下載數據從互聯網。但是,當下載完成時,我遇到了問題,我必須將所有部分合並在一起,這會浪費內存並耗費很長時間。如何分配磁盤中的文件來寫入數據C++

我看到Torrent和Flashget使用這種技術,我的名字我不知道。在下載之前,Torrent獲取文件的內容長度並自動在磁盤中分配一個空文件。之後,如果下載恢復,則下載的數據將填充此分配的文件。 Torrent或Flashget會檢查這個分配的文件以獲取它已經下載的字節,然後他們恢復下載。

任何人都可以用這種技術來幫助我,或者給我一些關於這個文件的鏈接?如果你可以用c#或C++建議我的例子,那將會很棒。寫作

1.打開文件:感謝您的幫助

+1

那麼你可以[SetFilePointer](https://msdn.microsoft.com/en-us/library/windows/desktop/aa365541(v = vs.85).aspx)任意長度,然後[SetEndOfFile ](https://msdn.microsoft.com/en-us/library/windows/desktop/aa365531(v = vs.85).aspx)來擴展它,但我不確定這將有助於_「Torrent或Flash獲取將檢查此分配文件以獲取字節已下載並恢復下載「_」。你需要跟蹤下載的內容。 _ [這可能也有用](http:// stackoverflow。com/questions/12434306/in-general-how-do-resuming-a-download-work)_ – MickyD

+0

你是指稀疏文件嗎? https://msdn.microsoft.com/en-us/library/windows/desktop/aa365564%28v=vs.85%29.aspx –

回答

0

預分配磁盤上的文件,你可以做以下。

HANDLE file = CreateFile("some_file.bin", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 

2.移動文件指針到所需的位置。

LONG download_size = /* check, how much data is going to be downloaded */; 
SetFilePointer(file, download_size, NULL, FILE_BEGIN); 

物理擴展文件。

SetEndOfFile(file); 

的更多信息:


至於這一部分:

檢查此分配文件以獲取字節已下載並恢復下載。

你可以通過存儲具有標題的自定義格式的部分下載來實現這一點。例如,定義一個結構:

struct TmpDownloadInfo 
{ 
    uint32_t header_size; 
    size_t downloaded_bytes; 
    //other fields? 
}; 

然後,在文件存儲臨時數據,即始於此標題,並更新其在每次修改(當然,要記住,在這種情況下,你將需要預先分配download_size + sizeof(TmpDownloadInfo) )。下載完成後,您可以刪除此標題並更新文件大小,也可以將整個數據複製到新的結果文件(也許「即時」合併)。

+0

謝謝@Mateusz Grzejek。即時通訊使用你的建議和預先分配文件成功。但即時通訊使用WriteFile將數據寫入預分配文件,但不成功。這裏我的問題[鏈接](http://stackoverflow.com/questions/30188022/libcurl-write-data-with-writefile-winapi) –