2015-03-19 86 views
2

我正在做一個應用程序(XE6,Firemonkey)來同步共享文件夾和計算機之間的文件。此應用程序會每x個小時檢查一次是否有新文件需要同步,並在Windows啓動時啓動。啓動時應用程序無法訪問文件

我可以做所有事情,我的應用程序開始啓動,並且它執行同步,只要我是一個啓動它的人。當應用程序在啓動時自動啓動,它給了我一個例外「EINOUTERROR」 - 文件訪問被拒絕。 在啓動應用程序時會讀取一個小的.txt文件來設置它自身(共享文件夾位置,同步速率等),我的猜測是,由於它啓動應用程序的窗口運行時沒有讀取.txt的權限,但是甚至在將.txt權限更改爲對所有人完全控制之後,它會給出相同的錯誤。

文件打開代碼:

procedure TSyncM.RunOnStartup(const sCmdLine: string; bRunOnce: boolean; Remove: Boolean) ; 
var sKey: string; 
Section: string; 
const ApplicationTitle = 'GEN4Sync'; 
begin 
     if (bRunOnce) then 
      sKey := 'Once' 
     else 
      sKey := ''; 
      Section := 'Software\Microsoft\Windows\CurrentVersion\Run' + sKey + #0; 
      with TRegIniFile.Create('') do 
       try 
       RootKey := HKEY_CURRENT_USER; 
       if Remove then 
        DeleteKey(Section, ApplicationTitle) 
       else 
        WriteString(Section, ApplicationTitle, sCmdLine) ; 
       finally 
        Free; 
       end; 
end; 

如果我評論的一段代碼調用的是閱讀的.txt我的應用程序啓動和:

AssignFile(myFile,'Dados.txt'); 

    if FileExists('Dados.txt') then 
     Append(myFile) 
    else 
     Rewrite(myFile); 

    FileMode := fmOpenRead; 
    Reset(myFile); 

放置在啓動程序應用程序的代碼執行得很好,但我不想每次都設置它。 在此先感謝

回答

3

我認爲這個問題與您使用相對路徑有關。您已經編寫了代碼,假定工作目錄與包含可執行文件的目錄是相同的目錄。這不一定如此。

例如,通過雙擊可執行文件啓動應用程序時,shell會確保初始工作目錄是包含可執行文件的目錄。但是,當Windows在啓動時啓動程序時,我懷疑工作目錄是系統目錄。當然你的文件沒有在那裏找到,你沒有寫在那裏的權利。

而不是使用相對路徑,使用文件的完整路徑。

FileName := ExtractFilePath(ParamStr(0)) + 'Dados.txt'; 

或許

FileName := TPath.Combine(ExtractFilePath(ParamStr(0)), 'Dados.txt'); 

注意,這樣做還假設您的可執行文件位於你可以寫一個文件夾中。情況往往不是這樣,所以你可能需要找到一個不同的位置。

我不得不發表評論,我覺得它有點不協調,你正在混合非常現代(FireMonkey)與古代(帕斯卡爾I/O)。也許現在是轉向更現代的I/O技術的時候了。

+0

是的,使用完整路徑解決了問題。謝謝。 通過說更現代的I/O技術,你有什麼建議? (不要求代碼,只是爲了我搜索和學習:)) 我是Firemonkey和Delphi的新手,而古老的Pascal I/O是第一個出現在谷歌上的東西。 – 2015-03-19 12:07:29

+0

該文件的內容是什麼? – 2015-03-19 12:09:28

+0

純文本。 那麼,我有一套共享文件夾,我需要確保一些計算機保持這些共享文件夾的最新副本。我有一個存儲這些信息的類,起初我想序列化這個類並將它存儲在一個文件中,就像在java中一樣,但是我在delphi中發現它很困難。由於這是我的一個小項目,我試圖保持簡單和小型的時間消耗。所以我寫了一個讀取類並將其寫入txt的過程,然後我在應用程序啓動時對其進行解釋。 – 2015-03-19 12:17:00