2015-03-19 1 views
2

Я делаю приложение (XE6, Firemonkey) для синхронизации файлов между общей папкой и компьютером/s. Это приложение проверяет каждые x часов, если есть новые файлы для синхронизации, и запускается при запуске Windows.Приложение can not access file при запуске

Я могу сделать все, мое приложение запускается при запуске, и это синхронизация, если только я начинаю ее. Whem запускается при запуске приложения, это дает мне исключение «EINOUTERROR» - отказ в доступе к файлам. При запуске приложение читает небольшой .txt-файл, чтобы настроить его самостоятельно (расположение общих папок, скорость синхронизации и т. Д.), Я предполагаю, что, поскольку его окна, запускающие приложение, запускают его без привилегий для чтения .txt, но даже после изменения разрешений .txt для полного контроля над всеми, он дает ту же ошибку.

Файл открыт код:

AssignFile(myFile,'Dados.txt'); 

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

    FileMode := fmOpenRead; 
    Reset(myFile); 

Код размещения приложения на запускаемых программ:

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 моих запусков приложений и выполняется хорошо, но я не хочу настраивать его каждый раз. Заранее спасибо

ответ

3

Я думаю, что проблема связана с использованием относительных путей. Вы написали код в предположении, что рабочий каталог является тем же самым каталогом, который содержит исполняемый файл. Это не обязательно так.

При запуске приложения двойным щелчком по исполняемому файлу, например, оболочка гарантирует, что начальный рабочий каталог является каталогом, содержащим исполняемый файл. Однако, когда Windows запускает вашу программу при запуске, я подозреваю, что рабочий каталог является системным каталогом. И, конечно, ваш файл там не найден, и у вас нет прав писать там.

Вместо использования относительных путей используйте полный путь к файлу.

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

Или, возможно,

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

Обратите внимание, что это также предположить, что исполняемый файл находится в папке, которую вы можете написать в. Это часто бывает не так, поэтому вам может понадобиться найти другое место.

Мне нужно прокомментировать, что я нахожу несколько нелепым, что вы смешиваете очень современный (FireMonkey) с древним (Pascal I/O). Возможно, пришло время перейти к более современной технике ввода-вывода.

+0

Да, используя полный путь, решена проблема. Благодарю. Говоря более современную технику ввода-вывода, что вы предлагаете? (не спрашивая код, просто голова для меня, чтобы искать и учиться :)) Я довольно новичок в Firemonkey и Delphi, и что древний Pascal I/O был первым, что появилось в google. –

+0

Что за файл? –

+0

Обычный текст. Ну, у меня есть набор общих папок, и мне нужно убедиться, что на некоторых компьютерах хранится обновленная копия этих общих папок. У меня есть класс, который хранит эту информацию, сначала я хотел сериализовать этот класс и хранить его в файле, как в java, но мне было сложно в delphi. И поскольку это мой небольшой проект, я старался сохранить его простым и небольшим временем. Поэтому я написал процедуру, которая читает класс и записывает его на txt, затем я интерпретирую его при запуске приложения. –

 Смежные вопросы

  • Нет связанных вопросов^_^