2011-03-07 75 views
1

我得到一個Delphi 7程序,它必須複製一個docx文件。我正在使用Windows API CopyFile函數。問題是這個函數似乎會對舊的doc格式進行隱藏轉換。第一件事:複製後文件大小增加。第二:在Office 2007中打開文件時,我收到一條錯誤消息,指出:檢查您對文檔或磁盤的權限,請檢查可用磁盤空間CopyFile docx隱藏轉換爲文檔

而不是奇怪的事情:如果我在TotalCommander中更改複製文件從docx到doc的擴展名,它通常會打開。所以它似乎使隱藏的轉換不知道爲什麼。

在兩臺不同的計算機上測試。 Win XP教授SP3,Office 2007 Prof Plus SP2

任何想法?

函數體低於:

function TDlgNowySzablon.PobierzPlikNaDoc() : string; 
var 
    openDlg : TOpenDialog; 
begin 
    Result:=''; 
    openDlg:=TOpenDialog.Create(self); 
    openDlg.Filter:='Dokumenty Microsoft Word (*.doc;*docx)|*.doc;*.docx'; 

    if openDlg.Execute then begin 
    Result := IObsSzab.GetTempFullFileName(ExtractFileExt(openDlg.FileName)); 
    if not CopyFile(PChar(openDlg.FileName),PChar(Result),true) then begin 
     Result:=''; 
    end; 
    end; 

    openDlg.Free; 
end; 
+0

」首先:複製後文件大小增加。「你真的確定會發生嗎? – CodesInChaos 2011-03-07 10:15:41

+1

Windows'CopyFile'函數不會將Microsoft Word DOCX文件轉換爲DOC。它與Microsoft Word無關。 – 2011-03-07 11:05:14

回答

5

試着改變你的代碼如下:

Result := IObsSzab.GetTempFullFileName('.tmp'); 
Result := ChangeFileExt(Result, ExtractFileExt(openDlg.FileName)); 

我覺得你GetTempFullFileName功能被截斷的.docx爲.doc。儘管這只是猜測!

CopyFile函數不會修改文件的內容。 「

+0

ChangeFileExt沒有改變我的文件擴展名,不知道爲什麼。但是,當我手動將.tmp重命名爲.docx時,它打開確定。所以我想我可以在這裏給予接受,其餘的我應該自己解決。謝謝。 – 2011-03-07 09:32:30

+0

無論如何,我仍然想知道爲什麼在複製目標文件擴展名時很重要。奇怪... – 2011-03-07 09:33:41

+3

@Robert好吧,CopyFile的lpNewFileName參數就是目標文件的完整名稱。它可以有你喜歡的任何擴展。文件內容不受影響。您的臨時文件函數可能基於Windows.GetTempFileName,它返回8.3文件名並將.docx截斷爲.doc。 – 2011-03-07 09:36:22