setFileValidData 函式 (fileapi.h)
設定指定檔案的有效資料長度。 此函式在非常有限的案例中很有用。 如需詳細資訊,請參閱<備註>一節。
語法
BOOL SetFileValidData(
[in] HANDLE hFile,
[in] LONGLONG ValidDataLength
);
參數
[in] hFile
檔案的控制碼。 檔案必須以 GENERIC_WRITE 存取權限開啟,且已啟用 SE_MANAGE_VOLUME_NAME 許可權。 如需詳細資訊,請參閱 檔案安全性和存取權限。
[in] ValidDataLength
新的有效資料長度。
此參數必須是大於目前有效資料長度,但小於目前檔案大小的正值。
傳回值
如果函式成功,則傳回非零的值。
如果函式失敗,則傳回值為 0。 若要取得擴充的錯誤資訊,請呼叫 GetLastError。
備註
SetFileValidData 函式會設定檔案的邏輯結尾。 若要設定檔案的大小,請使用 SetEndOfFile 函 式。 實體檔案大小也稱為檔案結尾。
每個檔案資料流程都有下列屬性:
- 檔案大小:檔案中的資料大小,到位元組。
- 配置大小:為磁片上的檔案配置的空間大小,一律是叢集大小的偶數倍數。
- 有效資料長度:實際寫入位元組之檔案中的資料長度。 這個值一律小於或等於檔案大小。
SetFileValidData函式可讓您避免在非佇列寫入檔案時以零填滿資料。 函式會讓檔案中的資料有效,而不需要寫入檔案。 因此,雖然可能會實現某些效能提升,但先前現有檔案的磁片上現有的資料可能會不小心變成非預期的讀取器可以使用。 下列段落提供此潛在安全性和隱私權問題的更詳細描述。
呼叫端一開始開啟檔案時,必須啟用 SE_MANAGE_VOLUME_NAME 許可權。 應用程式應該只在限制存取具有SE_MANAGE_VOLUME_NAME存取權之實體的檔案上呼叫SetFileValidData。 應用程式必須確定檔案的未寫入範圍永遠不會公開,或安全性問題可能會如下所示。
如果在檔案上使用 SetFileValidData ,則不會以零填入已配置之檔案的叢集來取得潛在的效能提升。 因此,從檔案讀取會傳回配置叢集包含的任何內容,可能是來自其他使用者的內容。 這不一定是目前的安全性問題,因為呼叫端必須具有setFileValidData成功SE_MANAGE_VOLUME_NAME許可權,而且這類使用者可以讀取磁片上的所有資料。 不過,如果保留下列專案,此呼叫端可能會不小心將此資料公開給其他使用者,而無法取得 SE_MANAGE_VOLUME_PRIVILEGE 許可權:
- 如果檔案未以拒絕其他讀取器的共用模式開啟,則非特殊許可權的使用者可以開啟它並讀取公開的資料。
- 如果系統在呼叫端完成寫入呼叫中提供的 ValidDataLength 之前停止回應,則在重新開機時,這類非特殊許可權的使用者可以開啟檔案並讀取公開的內容。
如果 SetFileValidData 的呼叫端開啟了具有適當限制存取控制的檔案,則不適用先前的條件。 不過,針對使用 SetFileValidData (擴充的部分寫入檔案,寫入未完成,但未完成呼叫中提供的 ValidDataLength ,) 還有另一個潛在的隱私權或安全性弱點。 系統管理員可以將檔案複製到未以限制性 ACL 許可權正確控制的目標,因此不小心將延伸區域的資料公開給未經授權的讀取。
基於這些原因,除了效能考慮之外,不建議 使用 SetFileValidData ,如下所述。
如需安全性和存取權限的詳細資訊,請參閱 以特殊許可權 和 檔案安全性和存取權限執行。
您可以使用 SetFileValidData 函式在非常特定的情況下建立大型檔案,讓後續檔案 I/O 的效能優於其他方法。 具體來說,如果檔案的擴充部分很大,而且會隨機寫入,例如在應用程式的資料庫類型中,擴充和寫入檔案所需的時間會比使用 SetEndOfFile 和隨機寫入更快。 在其他大部分情況下,使用 SetFileValidData通常沒有效能提升,有時可能會降低效能。
在 Windows 8 和 Windows Server 2012 中,下列技術支援此函式。
技術 | 支援 |
---|---|
伺服器訊息區 (SMB) 3.0 通訊協定 | 是 |
SMB 3.0 透明容錯移轉 (TFO) | 是 |
具有向外延展檔案共用的 SMB 3.0 (SO) | 是 |
叢集共用磁片區檔案系統 (CsvFS) | 是 |
彈性檔案系統 (ReFS) | 是 |
需求
最低支援的用戶端 | Windows XP [僅限傳統型應用程式] |
最低支援的伺服器 | Windows Server 2003 [僅限桌面應用程式] |
目標平台 | Windows |
標頭 | fileapi.h (包含 Windows.h) |
程式庫 | Kernel32.lib |
DLL | Kernel32.dll |