Eolite

Work with drives, directories, files
  • Eolite 3.75
    Читает первые 4 байта у файлов без расширения, и если это "KPAC" или "MENU", то показывает иконку программы.
    Attachments
    appicons.png
    appicons.png (40.8 KiB)
    Viewed 4833 times
    Из хаоса в космос
  • Code: Select all

    IF(DSDWORD[#BYTE_HEAD_FILE]=='KCPK')||(DSDWORD[#BYTE_HEAD_FILE]=='UNEM') icon_n = 6;
    Очень плохая идея. Упаковано kpack-ом может быть всё что угодно.
  • 0CodErr wrote:

    Code: Select all

    IF(DSDWORD[#BYTE_HEAD_FILE]=='KCPK')||(DSDWORD[#BYTE_HEAD_FILE]=='UNEM') icon_n = 6;
    Очень плохая идея. Упаковано kpack-ом может быть всё что угодно.
    Решение не идеальное, но оно в целом хорошее.
    Вероятность того, что файл упакован kpack-ом и не имеет расширения - мала.
    Из хаоса в космос
  • Значит ли это, что у приложений колибри нет собственного идентификатора?
    Или я чего-то не правильно понимаю?
  • Вероятность того, что файл упакован kpack-ом и не имеет расширения - мала.
    Ну вообще, да. Но можно при желании поправить kpack и добавить в header упакованного файла флаг, означающий, что упаковано приложение. Для этого вполне хватит одного бита. Другой вариант, это всё-таки начать использовать расширения kex. Хотя это вызовет увеличение длины имени файла. В принципе, думаю, можно даже оба варианта реализовать.
    Mega_Myr wrote:Значит ли это, что у приложений колибри нет собственного идентификатора?
    Или я чего-то не правильно понимаю?
    'MENUET01', если ты об этом.
  • Похоже я совсем не понимаю что происходит. Пожалуй на время воздержусь от вопросов.
  • Mega_Myr wrote:Похоже я совсем не понимаю что происходит. Пожалуй на время воздержусь от вопросов.
    У программ Колибри есть соственный идентификатор MENUET01 http://prntscr.com/dboos7
    Однако все программый в дисте сжаты KPACK'ом, потому имеют KPACK http://prntscr.com/dbopbk

    Как мне определить что сжатый файл это программа? Ну... его можно разжать, вот только это долго и нетсмысла так нагружать проц, чтобы просто отобразить иконку.

    Как вариант, предположить, что сжатый файл без расширения - это программа. Так и будет в 99,9% случаев, что приемлимо.

    0CodErr предложил варианты решения ситуации. Например, добавлять расширение .kex все программам.
    Из хаоса в космос
  • Leency wrote:Как мне определить что сжатый файл это программа? Ну... его можно разжать, вот только это долго и нетсмысла так нагружать проц, чтобы просто отобразить иконку.
    Чтение файла в любом случае долго. А что, если это будет не локальная папка? Получается, что лучше всё-таки использовать расширения. В принципе, никто и не мешает добавить их к программам.
  • У меня стояло в начале ограничение на эту фичу только /rd/1 и /tmp
    Но я решил включить для всех.

    Расширения вариант.
    Из хаоса в космос
  • Может наоборот ?

    Без расширения == программа.
  • что делать с файлами без расширений вроде licence и readme которые часто идут вместе с исходниками?
    Из хаоса в космос
  • Siemargl wrote:Без расширения == программа.
    Шире мыслить надо, шире! Можешь даже ради эксперимента проверить, сколько у тебя самого таких "программ без расширения".
    Вот, смотри, например
    Spoiler:
    0.PNG
    0.PNG (21.12 KiB)
    Viewed 4824 times
    Leency, я, кстати, вспомнил вдруг, что раньше можно было узнать размер свободного места на рамдиске.
    Лайфхак, как это можно сделать сейчас :P
    Думаю, суть кода понятна будет
    Spoiler:

    Code: Select all

    Unit Unit1;
    (* -------------------------------------------------------- *)
    Interface
    (* -------------------------------------------------------- *)
    Uses KolibriOS;
    (* -------------------------------------------------------- *)
    Var
      hConsole: Pointer;
      ConsoleInit:       Procedure(WndWidth, WndHeight, ScrWidth, ScrHeight: Dword; Caption: PChar); StdCall;
      ConsoleExit:       Procedure(bCloseWindow: Cardinal); StdCall;
      printf:            Function(Const Format: PChar): Integer; CDecl VarArgs;
    (* -------------------------------------------------------- *)
    Procedure Main;
    (* -------------------------------------------------------- *)
    Implementation
    (* -------------------------------------------------------- *)
    Procedure Main;
    Const FileName = '/RD/1/........';
    Var
        FileAttributes: TFileAttributes;
        LastAttributes: TFileAttributes;
    Begin
      hConsole          := LoadLibrary('/sys/lib/console.obj');
      ConsoleInit       := GetProcAddress(hConsole, 'con_init');
      ConsoleExit       := GetProcAddress(hConsole, 'con_exit');
      printf            := GetProcAddress(hConsole, 'con_printf');
    
      ConsoleInit($FFFFFFFF, $FFFFFFFF, $FFFFFFFF, $FFFFFFFF, 'Test');
    
      If GetFileAttributes(FileName, LastAttributes) <> 0 {If File Is Not Exist} Then Begin
        If CreateFile(FileName) <> 0 Then
          printf('RDFreeSize can not be determined.'#10)
        Else Begin
          ResizeFile(FileName, $FFFFFFFF, 0);
          GetFileAttributes(FileName, FileAttributes);
          printf('RDFreeSize = %d'#10, FileAttributes.SizeLo);
          DeleteFile(FileName);
        End;
      End Else {If File Is Already Exist} Begin
        ResizeFile(FileName, $FFFFFFFF, 0);
        GetFileAttributes(FileName, FileAttributes);
        printf('RDFreeSize = %d'#10, FileAttributes.SizeLo);
        ResizeFile(FileName, LastAttributes.SizeLo, 0);
      End;
    
      ConsoleExit(0);
      ThreadTerminate;
    End;
    (* -------------------------------------------------------- *)
    End.
    Spoiler:
    1.PNG
    1.PNG (4.17 KiB)
    Viewed 4824 times
    Downloaded 173 times
  • Leency wrote:что делать с файлами без расширений вроде licence и readme которые часто идут вместе с исходниками?
    Переименовать к единому стандарту.

    Т.е сначала утвердить некий список стандартных расширений.
  • Вроде всегда licence.txt и readme.txt. У меня вообще нет ни одного файла без расширения.
  • Who is online

    Users browsing this forum: No registered users and 1 guest