今日碰到有程序在我們產品系統環境下無法正常運行某些功能,使用Process Monitor加反復測試發現,與產品中創建的symlink(軟鏈接)有關。具體來講,symlink文件是一個軟鏈接文件,它的鏈接目標可以是任意盤上的文件。當訪問軟鏈接文件時,Windows文件系統(NTFS)會對該文件進行重解析(reparse),使其打開真正的目標文件。這里產生一個問題,并非所有的Win32 API都實現訪問軟鏈接文件時就自動指向目標文件,因為Windows要保證既能處理軟鏈接文件也能處理目標文件。
這里特別要指出的一個Win32 API是GetFileAttributeEx,用它去讀取軟鏈接文件屬性時(比較便捷,可一次性獲取文件的大小、時間和屬性),并不會自動獲取到目標文件的屬性,軟鏈接文件的大小和屬性一般必然與目標文件的不同,如果不做處理,可能獲取到的并非期望的文件屬性并產生錯誤的判斷!前面講到的有些程序無法正常運行就與此有關。我們來模擬一下看看,先創建一個軟鏈接:
link.txt鏈接到target.txt
在target.txt中隨便輸入些字符,保存。然后用資源管理器看link.txt的屬性:
link.txt屬性
再看target.txt的屬性:
target.txt的屬性
可以看到兩個文件的真實屬性完全不一樣。一般程序如果不是明確意圖要操作軟鏈接文件本身,則應該訪問的是目標文件。但GetFileAttibutesEx是眾多僅訪問軟鏈接文件的函數之一,如果要獲取目標文件的屬性,必須對軟鏈接的文件屬性做一個判斷,如果確認是軟鏈接,再進一步訪問目標文件。這里就利用到CreateFile不指定reparse標志的情況下默認打開目標文件的特性(Windows是利用CreateFile來做重解析,所以最好使用其打開句柄訪問文件才能保證訪問的是目標文件)。直接上代碼:
DWORD GetRealAttr(LPCTSTR file_name, WIN32_FILE_ATTRIBUTE_DATA& output_attr)
{
DWORD err = ERROR_SUCCESS;
WIN32_FILE_ATTRIBUTE_DATA attr_data { 0 };
//AdjustPrivilege(SE_CREATE_SYMBOLIC_LINK_NAME, TRUE);
if (::GetFileAttributesEx(file_name, GetFileExInfoStandard, &attr_data)) {
//_tprintf(_T("link file size=%I64d\n"), ((LONGLONG)attr_data.nFileSizeHigh << 32) | attr_data.nFileSizeLow);
if (attr_data.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) {
HANDLE hFile = ::CreateFile(file_name,
FILE_READ_DATA,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (INVALID_HANDLE_VALUE != hFile) {
BY_HANDLE_FILE_INFORMATION target_info{ 0 };
if (GetFileInformationByHandle(hFile, &target_info)) {
output_attr.dwFileAttributes = target_info.dwFileAttributes;
output_attr.ftCreationTime = target_info.ftCreationTime;
output_attr.ftLastAccessTime = target_info.ftLastAccessTime;
output_attr.ftLastWriteTime = target_info.ftLastWriteTime;
output_attr.nFileSizeHigh = target_info.nFileSizeHigh;
output_attr.nFileSizeLow = target_info.nFileSizeLow;
//_tprintf(_T("target file size=%I64d\n"), ((LONGLONG)target_info.nFileSizeHigh << 32) | target_info.nFileSizeLow);
}
else {
err = ::GetLastError();
}
::CloseHandle(hFile);
}
else {
err = ::GetLastError();
}
}
else {
memcpy(&output_attr, &attr_data, sizeof(WIN32_FILE_ATTRIBUTE_DATA));
}
}
else {
err = ::GetLastError();
}
return err;
}
最后我們看實際讀取到的link.txt和target.txt的文件大?。?/p>
link.txt大小為0, target.txt大小為24字節
在我們的日常工作中,經常會遇到文件夾被隱藏的情況,這可能會讓我們在尋找需要的文件時感到困惑。那么,如何找回這些隱藏的文件夾呢?本文將為你提供一些實用的方法,幫助你解決這個問題。
圖片來源于網絡,如有侵權請告知
在解決隱藏文件夾的問題之前,我們需要了解文件夾為什么會隱藏。一般來說,文件夾隱藏的原因有以下幾種:
用戶誤操作:在設置文件夾屬性時,可能不小心將文件夾設置為隱藏狀態。
病毒或惡意軟件干擾:一些病毒或惡意軟件會將文件夾設置為隱藏狀態,以保護自己的惡意程序不被發現。
系統故障:在某些情況下,由于系統故障或錯誤,文件夾可能會被隱藏。
文件夾隱藏了怎么找出來?怎么把隱藏的文件夾恢復可見?不妨嘗試下面三種方法:
1、使用文件資源管理器
- 打開文件資源管理器(快捷鍵Win + E)。
- 點擊界面上方的“查看”選項。
- 將“隱藏的項目”勾選上以顯示隱藏的文件夾。
2、使用.bat批處理文件
- 在要顯示隱藏文件夾的目錄下,創建一個新的文本文檔。
- 在文檔中輸入以下代碼:attrib -h -r -s /s /d,這將清除文件夾的所有隱藏屬性。
- 保存并關閉文本文檔后,選中剛剛的“新建文本文檔.txt“并重命名為“取消隱藏.bat”。
若看不到.txt和.bat這些后綴,需先顯示文件后綴名。
- 雙擊運行“取消隱藏.bat”批處理文件,文件夾應該就會顯示出來。
3、使用命令提示符
- 按下“Win+R”鍵,在打開的運行窗口中輸入“cmd”,然后點擊“確定”按鈕或按下“Enter”鍵。
- 在命令提示符中,使用“cd”命令來導航到您要顯示隱藏文件夾的目錄。例如,如果隱藏文件夾位于“C:\”目錄下,您可以輸入“cd C:\”來導航到該目錄。
- 然后再輸入“dir /ah”命令并按下回車鍵,這將顯示當前目錄下所有的隱藏的文件和文件夾。
通過上述方法顯示出隱藏文件夾后,我們會發現它比正常的文件夾圖標顏色會更淺,有種透明狀態,這時我們可以嘗試修改文件夾的屬性來恢復正常顯示。
- 右鍵單擊需修改屬性的文件夾,選擇“屬性”。
- 然后在常規選項卡中取消選中“隱藏”復選框,最后點擊“確定”即可。
文件夾找不到了怎么辦?如果以上方法都無法找回隱藏的文件夾,在未備份數據的情況下,我們可以嘗試使用第三方軟件進行恢復。市面上有很多數據恢復軟件可以幫助我們找回丟失的文件夾,但是任何軟件都無法保證百分百恢復,因此,我們可以先使用支持免費掃描和預覽的軟件,如云騎士數據恢復軟件進行預判。
演示機型:技嘉 H310M HD22.0
系統版本:Windows 10 專業版
軟件版本:云騎士數據恢復軟件 3.21.0.92
- 免費下載<云騎士數據恢復軟件>,請注意在下載安裝時避免將軟件安裝在丟失文件夾所在的磁盤。
- 根據提示安裝軟件并啟動,根據需要選擇恢復模式,這里以“誤刪除文件”選項以開始使用。
- 選擇恢復模式以后,選擇丟失文件夾所在磁盤,例如C盤,選擇好以后點擊“開始掃描”按鈕。
- 完成掃描后,可以通過文件類型、文件名稱以及文件路徑等方式進行精確定位并預覽文件夾中的數據。
- 最后選擇需要的文件夾(文件),點擊“立即恢復”,將它們保存到其他磁盤,就可以查看已經恢復出來的文件夾數據了。
溫馨提示:為了提高數據恢復的成功率,請避免在文件夾所在的磁盤上寫入新的數據。
通過本文的介紹,相信你已經了解了如何找回隱藏的文件夾。在實際操作中,請根據具體情況選擇適合的方法進行操作。同時,為了防止類似問題的再次發生,建議定期備份重要數據并對電腦進行安全檢查,以保護個人隱私和數據安全。
u盤不小心分區了數據還能恢復嗎?分享實用恢復方法
tf卡被格式化怎么恢復里面的數據?恢復指南在此
為什么移動了一些文件夾后電腦找不到了?如何解決