2014-02-05 17 views
5

我有一個外部USB,NTFS格式的硬盤驅動器,其中包含我需要最終複製到Windows Server 2008 R2計算機上的驅動器的許多文件。在Windows上處理帶有文件名的回車文件

驅動器上的文件被安裝在Solaris上的驅動器運行的腳本放置在那裏。誰做了這個副本的用戶是不小心和編輯它們的拷貝腳本在Windows機器上,導致shell腳本線,如:

cp /sourceDir/sourceFileName /externalDrivePath/targetFileName\r\n 

,因此,外部驅動器上的文件有尾回車他們文件名。標準Windows複製實用程序(複製,xcopy,robocopy)無法複製這些錯誤爲0x7B/123的文件:「文件名,目錄名稱或卷標語法不正確。」

我已經測試過,和我相當肯定,如果我有幹勁再次安裝在Linux中,我應該能夠將文件修復與如命令:

mv /externalDrive/targetFileName\r /externalDrivePath/targetFileName\n 

不過,我不知道可以立即訪問Linux機器。

我迄今試圖修復/移動這些文件:

「應用程序」上的Windows Server 2008 R2的解決方案:

  1. 在Windows資源管理器重命名文件 - 將因不可行的解決方案大量的文件,但它無法正常工作。
  2. 匹配來自cmd提示符的文件名的通配符模式,例如copy E:\externalDrivePath\targetFileName* anotherPath。失敗,0x7B錯誤。
  3. 使用8.3(短)文件名從cmd提示覆制文件。有關文件沒有短名稱,每dir /x

「編程」 輸出的Windows Server上的解決方案2008 R2:

  1. 複製/使用Python/Java的命名文件:任何企圖打開/複製回車文件將異常跟蹤返回到相同的0x7B Windows錯誤。
  2. 使用Windows C'CopyFile'API複製文件:失敗,並顯示0x7B錯誤。在這裏,我使用FindNextFile API找到了這些文件,並將該源路徑傳遞到CopyFile,但操作系統仍無法複製該文件。
  3. 使用fopen,ofstream等在C中編寫我自己的文件複製函數fopen調用再次失敗,0x7B。
  4. 使用C++ boost :: filesystem API複製文件:失敗,出現0x7B錯誤。再次,使用boost :: filesystem :: directory_iterator找到這些文件,並將找到的文件的路徑傳遞給boost :: filesystem :: copy_file()
  5. 將文件路徑提供給Win32 API CopyFile/MoveFile as「\?\ E:\ externalDrivePath \ targetFileName \ r」。調用再次失敗,併發生0x7B錯誤。

我也在OS X機器上安裝這個驅動器來運行這個拷貝,期望它能像Solaris那樣提供對NTFS驅動器的支持。但是,它無法將類似的錯誤消息複製到Windows - 我想OS X的NTFS實現更像「類Windows」?

如果這是可以解決的Windows上,我覺得它會要麼需要操縱文件本身一個非常低級的C函數,沒有「開放」是基於它的字符串的文件名。不知道如何去做。那個,或者我不知道哪個文件修復工具已經合併了這個功能。

任何其他辦法或建議如何實現我所描述的將是非常讚賞的。

+0

您是否嘗試過使用'\\?\ E:\ externalDrivePath \ targetFileName'作爲Win32 API的路徑? – Simple

+0

文件是否也有8.3個名字?技術上你是可選的,但這很常見。 FindFirstFile將會報告它。 – MSalters

+0

將這兩個添加到我現在嘗試的事情列表中,但不幸的是這兩個都不適用。 – cuberoot8

回答

0

我在90ies中期有類似的問題,在Windows 3.11。

我最終從C程序中使用rename(在<stdio.h>中聲明)。

如果失敗,您可以嘗試低級別C系統調用:open,readwrite將文件複製到新名稱。

低級別的呼叫通常繞過用戶友好的高級功能施加的限制。

+0

我預料這將是正確的方法,但令人驚訝的是無法使其工作 - open()和rename()都失敗。我還沒有深入瞭解錯誤原因,但是從Windows對C語言的(有限的)理解,我認爲這兩者都依賴於CreateFile Win32 API。直接在壞文件路徑上調用CreateFile會返回0x7B。 – cuberoot8

1

TLDR:嘗試使用前綴爲\\?\的unicode路徑幷包含尾隨回車符的CreateFileW

\\?\路徑語法繞過了很多通常的驗證規則,unicode擴展等,並允許長文件路徑,甚至(危險地)允許在文件名內使用斜線等字符。

鑑於這種情況,我會想象一個回車應該是相當瑣碎的處理...

This page relating to long filenames有更多的細節。相關部分報價低於

沒有必要由Windows文件來執行的路徑和文件名字符串的任何Unicode正常化使用I/O API函數,因爲文件系統將路徑和文件名作爲不透明序列WCHARs。任何對相關Windows文件I/O API函數的調用都應該考慮到應用程序所需的任何規範化操作。

當使用API​​來創建一個目錄,指定的路徑不能這麼長時間,你不能追加的8.3文件名(即,目錄名稱不能超過MAX_PATH零下12)。 shell和文件系統有不同的要求。 可以使用Windows API創建一個shell用戶界面無法正確解釋的路徑。

而且從here

在較新的文件系統,如NTFS,前FAT,UDF和FAT32的Windows存儲在Unicode中,磁盤上的長文件名,這意味着原來的長文件名始終保留。即使長文件名包含擴展字符,並且無論在磁盤讀取或寫入操作期間處於活動狀態的代碼頁如何,情況都是如此。即使文件系統不區分大小寫,文件名的情況下也會被保留...

相關問題