[英]handling files with multiple “.” in filename boost::filesystem::stem
[英]Handling files with carriage return in filename on Windows
我有一個外部USB,NTFS格式的硬盤驅動器,其中包含許多文件,我需要最終復制到Windows Server 2008 R2計算機上的驅動器。
驅動器上的文件由安裝在Solaris上的驅動器運行的腳本放置在那里。 執行此副本的用戶不小心並在Windows計算機上編輯了他們的副本腳本,從而產生了shell腳本行,例如:
cp /sourceDir/sourceFileName /externalDrivePath/targetFileName\r\n
因此,外部驅動器上的文件在其文件名中有一個尾隨回車符。 標准Windows復制實用程序(copy,xcopy,robocopy)無法復制這些文件,錯誤為0x7B / 123:“文件名,目錄名稱或卷標語法不正確。”
我已經測試過,並且相當確定如果我將驅動器再次安裝在Linux機器上,我應該可以使用以下命令修復文件:
mv /externalDrive/targetFileName\r /externalDrivePath/targetFileName\n
但是,我沒有立即訪問Linux機器。
到目前為止我已經嘗試過修復/移動這些文件:
Windows Server 2008 R2上的“應用程序”解決方案:
copy E:\\externalDrivePath\\targetFileName* anotherPath
。 失敗,出現0x7B錯誤。 dir /x
Windows Server 2008 R2上的“編程”解決方案:
我還涉及在OS X機器上安裝此驅動器以運行副本,期望它將像Solaris那樣為NTFS驅動器提供支持。 但是,它無法將類似的錯誤消息復制到Windows - 我猜OS X的NTFS實現更像“Windows-like”?
如果這在Windows上是可解的,我覺得它要么需要一個非常低級的C函數來操作FILE本身,而不是根據它的字符串文件名“打開”它。 不知道該怎么做。 那個,或者我不知道的一些文件修復工具已經包含了這個功能。
任何替代方法或建議如何實現我所描述的將是最受歡迎的。
TLDR:嘗試使用前綴為\\\\?\\
並包含尾隨回車符的unicode路徑的CreateFileW
。
\\\\?\\
path語法繞過了許多常用的驗證規則,unicode擴展等,並允許長文件路徑,甚至(危險地)允許文件名中的斜杠等字符。
鑒於此,我認為回車應該是相當微不足道的...
這個與長文件名相關的頁面有更多細節。 相關部分引用如下
無需對路徑和文件名字符串執行任何Unicode規范化以供Windows文件I / O API函數使用,因為文件系統將路徑和文件名視為不透明的WCHAR序列。 在對相關Windows文件I / O API函數進行任何調用之外,應記住應用程序所需的任何規范化。
使用API創建目錄時,指定的路徑不能太長,以至於無法附加8.3文件名(即目錄名不能超過MAX_PATH減去12)。 shell和文件系統有不同的要求。 可以使用Windows API創建一個shell用戶界面無法正確解釋的路徑。
從這里開始
在較新的文件系統(如NTFS,ex-FAT,UDFS和FAT32)上,Windows以Unicode格式將長文件名存儲在磁盤上,這意味着始終保留原始長文件名。 即使長文件名包含擴展字符,也不管在磁盤讀取或寫入操作期間處於活動狀態的代碼頁,都是如此。 即使文件系統不區分大小寫,也會保留文件名的大小寫...
在Windows 3.11上,我在90年代中期遇到過類似的問題。
我最終使用了C程序的rename
(在<stdio.h>
聲明)。
如果失敗,您可以嘗試低級C系統調用: open
, read
和write
將文件復制到新名稱。
低級別呼叫通常會繞過用戶友好的高級功能所施加的限制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.