пятница, 7 февраля 2014 г.

DropBox против файлов

Есть у меня утилитка DeployFolder (http://alhymov.blogspot.ru/2013/12/deployfolder.html), которая текстовый файл меняет. Файл - проект Делфи. Т.е. XML, но без заголовка. И как этот заголовок отрезать, я не знаю (может, кто надоумит?). Поэтому тупо взял, записанный на диск XML всосал в TStringList, ну и, после удаления верхней строки, записал обратно.

Сначала всё было хорошо, а потом - как-то не очень: ругань пошла о занятом файле. Я, поскольку утилитка-то из Дельфи-студии запускается, решил, что Дельфи его как-то блокирует. Причём маленькие проекты - ОК, а большие - плохо. Тогда я стал проект в Дельфи ручками закрывать перед запуском утилиты, и как-бы стало работать. А потом прошло время, и - опять 25!

Ну, понял я - дело не в Делфи. Наверно, в Винде дело - она не успевает от предыдущей записи отблокироваться. Бред, конечно, но мозгный натиск не сразу Измаил берёт.

И вот я так думал-думал, и - придумал! Т.е. догадался! Проект, который "блокируется" - лежит в DropBox-е, и я его там и пользую. А если посмотреть в проводник, то в окошке этом очень хорошо видно, что на файликах значки меняются - DropBox апдэйтит файлы. А когда DropBox апдэйтит файлы, то что? - правильно! - файл блокируется от внешних посягательств.

Э! - сказали мы с Петром Ивановичем (Это я так раздваиваю свою личность иногда) - так надо же самому первому блокировку положить! Но как вспомнишь про Win32 API, так что-то хочется ещё немного подумать.

Решил я мысль свою в блоге отразить, и по ходу изложения (слава блогу!) догадался, что глупый я, однако, совсем! Зачем же я на диск пишу, и потом тут же считываю, если можно в памятный поток всё сложить, и к диску обращаться только однажды!

Вот сколько буковок из себя выдавил. А смысл - избаловали нас ПК, а не всё, что прокатывает в нормальных условиях, прокатывает в распределённой системе, в DropBox-е. Т.е. польза от буковок должна быть. А мыслеметания бредовые свои я здесь изложил, чтобы читатель понял, что он-то гораздо умнее, и было бы ему от этого очень приятно мои буковки читать. Т.е. полезное с приятным. Так, мне кажется, в мире будет больше счастья и радости.

Итого. Было:

    XMLDocument1.SaveToFile( XMLDocument1.FileName );
    XMLDocument1.Active := False;
 
    ShowStatus( 'Set standard header' ) ;
    with TStringList.Create do
    try
      LoadFromFile( XMLDocument1.FileName );
      Delete( 0 );
      SaveToFile( XMLDocument1.FileName );
    finally Free;
    end;
 
Стало:

    Memory := TMemoryStream.Create;
    try
  //    XMLDocument1.SaveToFile( XMLDocument1.FileName );
      XMLDocument1.SaveToStream( Memory );
      XMLDocument1.Active := False;
 
      ShowStatus( 'Set standard header' ) ;
      with TStringList.Create do
      try
//        LoadFromFile( XMLDocument1.FileName );
        Memory.Position := 0;
        LoadFromStream( Memory );
        Delete( 0 );
        SaveToFile( XMLDocument1.FileName );
      finally Free;
      end;
    finally FreeAndNil( Memory );
    end;
 
Жизнь покажет, будет ли теперешнее отсутствие ошибок постоянным. А читателя благодарю за внимание и надеюсь, что грабли сии минуют его, а сам я буду впредь рачительнее использовать вычислительные ресурсы.