1. C++ / Говнокод #13018

    +17

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    int getFilesize(char* fname) {
        int f=open(fname, O_RDONLY);
        int size=0;
        if (f<0) {/*не важно*/}
        size=lseek(f, 0, SEEK_END);
        close(f);
        return size;
    }

    Писал прогу под линукс впервые. К концу написания уже знал что такое stat(), но как глянул в начало...)))))

    Запостил: eax, 18 Мая 2013

    Комментарии (11) RSS

    • почти не говно.

      на MS-DOS, у int 21h не было функции возвращающей размер файла. вот такая фигня была длительное время официальным способом определения размера файла. да и опять же, на виндах, GetFileSize() хочет хэндл файла, что значит что файл нужно открыть что бы узнать размер.

      да что я говорю, говно, говно.

      PS упс. начиная с XP есть GetFileAttributesEx().
      Ответить
      • Метод не говно в нескольких случаях:
        1. Для определения стелс-вирусов, когда размер в атрибутах и размер потока не совпадают.
        2. Для не совсем файлов, т. е. для непонятной хрени, которая открывается как файл, но на диске не лежит, а потому атрибутов может не иметь. Правда, не любые потоки сикабельны...
        Ответить
        • "1. Для определения стелс-вирусов, когда размер в атрибутах и размер потока не совпадают."

          я сомневаюсь что это когда либо работало с NT или *NIX. только на ранних линухах можно было писать на прямую на диск с которого уже была смонтирована файловая система. (про масдай и вынь9х молчу.)

          "2. Для не совсем файлов, т. е. для непонятной хрени, которая открывается как файл, но на диске не лежит, а потому атрибутов может не иметь. Правда, не любые потоки сикабельны..."

          детский сад. последнее что ты хочешь, это какой железке (например тому же стримеру) сказать, "плиз прокрути до конца." тут уже проще - и безопастнее - попросить пользователя ввести размер вручную. какая "непонятная херня" скорее всего только с ioctl() (или на виндах DeviceIoControl()) и будет работать. почему и может называется непонятной херней, потому что не поддерживает стандартных интерфейсов типа char или block device (которые предусматривают возможность вернуть размер). (это я как бывшый разработчик драйверов пишу.)
          Ответить
    • Не говно.
      Ответить
      • Вот говно:
        strlen(mapFileToMemory(handle1));
        Ответить
        • mapFileToMemory() не знаю такого, знаю mmap(), но вроде для его использования уже нужно знать сколько байт отображать в память
          Ответить
    • Говно. Размер файла в Linux меряется в off_t, а ваша программа об мои HD-фильмы обломает зубы (ибо 15 Гб в int не помещаются)
      Ответить
      • Все такие проги поломались уже давным давно, как только появились DVD и их образы в ISO...
        Ответить
    • c++ где тут, %username%
      за int говно
      за неконстантный char * говно
      за способ определения длины файла - иногда имеет право на жизнь
      Ответить
      • Еще за забавную проверку на ошибку открытия файла - тоже говно.
        Ответить
        • Проверка там проводится нормально, я ее вырезал чтоб сильно не засирать пространство кодом
          Ответить

    Добавить комментарий