2011-12-26 77 views
1

我有一個應用程序有3個窗體(TForm1,TForm2,TForm3)。我需要的代碼如下: On TForm1.BitBtn點擊「10.220.70.32 BSNLESDP25A」和「10.220.70.33 BSNLESDP25B」將從位於「%windir%\ System32 \ drivers \ etc」目錄中的「主機」文件中搜索。如果找到「主機」文件屬性將更改爲「只讀」和「系統」,並顯示Form2。如果沒有找到,則「主機」文件的「只讀」和「系統」屬性將被刪除,並且「主機」文件的兩行將被添加爲「10.220.70.32 BSNLESDP25A」和「10.220.70.33 BSNLESDP25B」,並且將顯示Form3 。德爾福字符串搜索從文件

+4

請張貼代碼顯示到目前爲止你已經嘗試過的情況,並解釋如何它不工作,你所期望的方式。這不是一個人們爲你編寫所有代碼的網站;你需要表明你已經付出了一些努力來自己解決問題。 –

+0

我是學習者。我還沒有明確的想法。 –

+0

您將需要運行提升的進程並處理64位系統上的文件重定向。改變屬性似乎毫無意義。什麼試圖實現? –

回答

2

您可以使用IOUtils.TFile作爲GetAttributesSetAttributes;這裏是來自XE2文檔的example,它顯示了兩者都使用。

由於hosts文件通常很小,我可能會使用TStringList來打開並搜索它,因爲它是最快最簡單的方法。

你就會有問題,而無需管理員帳戶下運行這樣做,因爲沒有在 Windows\文件夾
uses 
    System.IOUtils; 

// Clear the readonly and system attributes 
var 
    Attributes: TFileAttributes; 
    SL: TStringList; 
    Idx: Integer; 
begin 
    Attributes := []; // Clear any existing attributes 
    TFile.SetAttributes(PathAndFileName, Attributes); 
    SL := TStringList.Create;  
    try 
    SL.LoadFromFile(PathAndFileName); 
    if SL.IndexOf(YourFirstSearchString) = -1 then // Not found 
     SL.Add(YourFirstSearchString); 
    if SL.IndexOf(YourSecondSearchString) = -1 then 
     SL.Add(YourSecondSearchString); 
    SL.SaveToFile(PathAndFileName); 
    finally 
    SL.Free; 
    end; 
    Include(Attributes, TFileAttribute.faSystem); 
    Include(Attributes, TFileAttribute.faReadOnly); 
    TFile.SetAttributes(PathAndFileName, Attributes); 
end; 

注意,可以以其他方式寫入。您應該在應用程序中包含一個清單,告訴Windows應用程序需要管理員權限,因此UAC將提示用戶輸入管理員帳戶和密碼。有些例子在SO上添加清單。

(另見大衛對您關於64位Windows重定向問題發表評論。)

+0

「屬性:TFileAttributes」給出未定義的標識符。請幫幫我。 –

+0

'TFileAttributes'來自'IOUtils'單元,就像'TFile'一樣。 –

+0

對不起,只記得你提到過XE2。我修復了代碼以反映新的命名要求。 –