Форум » [x]Harbour » Не работает FILESIZE() и FILEPOS() в xHarbour'e » Ответить

Не работает FILESIZE() и FILEPOS() в xHarbour'e

Andrey: Всем привет ! Собрал пример для себя на xHarbour 1.0.0 для построчного считывания строк из файла и облом... Не работают функции FILESIZE() и FILEPOS() ! Может быть я туплю... или совсем заработался.... Помогите кто может... Пример здесь [more]#include "fileio.ch" #include "common.ch" #define CRLF Chr( 13 ) + Chr( 10 ) FUNCTION MAIN() LOCAL aDim, cFilePrg := SUBSTR(EXENAME(),1,RAT(".",EXENAME()) - 1 )+'.prg' CLEAR SCREEN ? "Считываю файл - ",cFilePrg aDim := LOADFILE( cFilePrg ) ? Len( aDim) wait RETURN NIL FUNCTION LOADFILE( cFileInp ) LOCAL hFile, nStatus, nSizeFile, cFileJorn := "error.txt", cTemp LOCAL nI := 0, aFileDim := { }, cLine hFile := FOpen( cFileInp, 0 ) nStatus := FError() IF nStatus # 0 cTemp := "ОШИБКА ! ПРОПУСК !" + "Не смог открыть файл: " + cFileInp + " !" STRFILE( CRLF + cTemp + CRLF, cFileJorn, .T. ) RETURN {} //-1 ELSE nSizeFile := FSeek( hFile, 0, FS_END ) // конец файла = 2 IF nSizeFile == 0 // Считаем длину файла FClose( hFile ) cTemp := "ОШИБКА ! ПРОПУСК !" + "Файл: " + cFileInp + " ПУСТОЙ ! " STRFILE( cTemp + CRLF, cFileJorn, .T. ) RETURN {} //-2 ELSE STRFILE( "<< Начало файла >>" + CRLF, cFileJorn, .F. ) FSeek( hFile, 0, FS_SET ) // начало файла = 0 // Считаем файл в Массив WHILE ( ! FEOF( hFile ) ) nI ++ cLine := FREADLN( hFile ) ? ? " Номер строки в файле:", nI // Встретился конец файла, перевод строки и возврат каретки //cLine := STRTRAN( cLine, CHR( 26 ), "" ) //cLine := STRTRAN( cLine, CHR( 10 ), "" ) //cLine := STRTRAN( cLine, CHR( 13 ), "" ) cLine := StrTran( cLine, Chr( 13 ) + Chr( 10 ), "" ) // WIN code page -> DOS code page // cLine := HB_AnsiToOem(cLine) AAdd( aFileDim, cLine ) // Запись в журнал для контроля STRFILE( cLine + CRLF, cFileJorn, .T. ) IF nI == 169 EXIT ENDIF ENDDO FClose( hFile ) STRFILE("<< Конец файла >>"+CRLF+CRLF, cFileJorn, .T.) ENDIF // nSizeFile == 0 ENDIF // nStatus # 0 RETURN aFileDim /*** * * FReadLn( <nHandle>, [<nLines>], [<nLineLength>], [<cDelim>] ) --> cLines * * Считать одну или более строк из текстового файла * * ЗАМЕЧАНИЕ: * Длина строки включает символы разделители, поэтому максимальная * длина считанной строки равна (nLineLength - LEN( cDelim )) * * Возвращает строку с разделителями, если они были считаны * * nLines по умолчанию равна 1, nLineLength равна 256 и cDelim равен CRLF * * FERROR() должна проверить успешное завершение FReadLn() * * FReadLn() возвращает "" когда достигается EOF * */ FUNCTION FReadLn( nHandle, nLines, nLineLength, cDelim ) LOCAL nCurPos // Текущая позиция указателя в файле LOCAL nFileSize // Размер файла LOCAL nChrsToRead // Количество считанных символов LOCAL nChrsRead // Количество фактически прочитанных символов LOCAL cBuffer // Буффер для чтения файла LOCAL cLines // Возвращаемое значение, прочитанные строки LOCAL nCount // Количество прочитанных строк LOCAL nEOLPos // Позиция EOL в cBuffer DEFAULT nLines TO 1 DEFAULT nLineLength TO 256 DEFAULT cDelim TO ( Chr( 13 ) + Chr( 10 ) ) nCurPos := FilePos( nHandle ) nFileSize := FileSize( nHandle ) ? "Тек.позиция=",nCurPos, "Размер файла=",nFileSize Inkey( 0 ) // Удостовериться, что не будет попытки прочесть за EOF nChrsToRead := Min( nLineLength, nFileSize - nCurPos ) cLines := '' nCount := 1 DO WHILE ( ( nCount <= nLines ) .AND. ( nChrsToRead != 0 ) ) cBuffer := Space( nChrsToRead ) nChrsRead := FRead( nHandle, @cBuffer, nChrsToRead ) // Проверяется условие ошибки IF ! ( nChrsRead == nChrsToRead ) // Ошибка! // Для того чтобы оставаться концептуально совместимым с другими // функциями низкого уровня, вынуждены заставить проверять пользователя // FERROR() ( кот. выше определена функцией FREAD() ) // для обнаружения этого факта // nChrsToRead := 0 ENDIF nEOLPos := At( cDelim, cBuffer ) // Обновить буффер и пазицию указателя файла IF ( nEOLPos == 0 ) cLines += Left( cBuffer, nChrsRead ) nCurPos += nChrsRead ELSE cLines += Left( cBuffer, ( nEOLPos + Len( cDelim ) ) - 1 ) nCurPos += ( nEOLPos + Len( cDelim ) ) - 1 FSeek( nHandle, nCurPos, FS_SET ) ENDIF // Убедимся, что не пытаемся прочесть за пределами EOF IF ( ( nFileSize - nCurPos ) < nLineLength ) nChrsToRead := ( nFileSize - nCurPos ) ENDIF nCount ++ ENDDO RETURN ( cLines ) /*** * * FEof( <nHandle> ) --> lBoundary * * Определить находится ли указатель на последнем байте файла * */ FUNCTION FEof( nHandle, nSay ) IF nSay == 1 ? ? FileSize( nHandle ) , " == ", FilePos( nHandle ) ENDIF RETURN ( IF( FileSize( nHandle ) == FilePos( nHandle ), .T., .F. ) ) /*** * * FilePos( <nHandle> ) --> nPos * * Возвращает текущую позицию указателя считывания для двоичного файла * */ FUNCTION FilePos( nHandle ) RETURN ( FSeek( nHandle, 0, FS_RELATIVE ) ) //End file FileLoad.prg [/more]

Ответов - 8

TimTim: В xHarbour функция FileSize имеет формат FileSize( [<cFileName>], [<nAttributes>] ) --> nFileSize т.е. первым параметром является не "хэндл", а имя файла.

Andrey: Блин, а я не сообразил сразу.... Но тогда почему у меня в общей системе работало ??? Век живи, век учись.... Короче, все заработало... Спасибо большое Темуру ! Рабочий вариант здесь #include "fileio.ch" #include "common.ch" #define CRLF Chr( 13 ) + Chr( 10 ) FUNCTION MAIN() LOCAL aDim, cFilePrg := SUBSTR(EXENAME(),1,RAT(".",EXENAME()) - 1 )+'.prg' CLEAR SCREEN ? "Считываю файл - ",cFilePrg aDim := LOADFILE( cFilePrg ) ? Len( aDim) wait RETURN NIL FUNCTION LOADFILE( cFileInp ) LOCAL hFile, nStatus, nSizeFile, cFileJorn := "error.txt", cTemp LOCAL nI := 0, aFileDim := { }, cLine hFile := FOpen( cFileInp, 0 ) nStatus := FError() IF nStatus # 0 cTemp := "ОШИБКА ! ПРОПУСК !" + "Не смог открыть файл: " + cFileInp + " !" STRFILE( CRLF + cTemp + CRLF, cFileJorn, .T. ) RETURN {} //-1 ELSE nSizeFile := FSeek( hFile, 0, FS_END ) // конец файла = 2 IF nSizeFile == 0 // Считаем длину файла FClose( hFile ) cTemp := "ОШИБКА ! ПРОПУСК !" + "Файл: " + cFileInp + " ПУСТОЙ ! " STRFILE( cTemp + CRLF, cFileJorn, .T. ) RETURN {} //-2 ELSE STRFILE( "<< Начало файла >>" + CRLF, cFileJorn, .F. ) FSeek( hFile, 0, FS_SET ) // начало файла = 0 // Считаем файл в Массив WHILE ( ! FEOF( hFile ) ) nI ++ cLine := FREADLN( hFile ) ? " Номер строки в файле:", nI // Встретился конец файла, перевод строки и возврат каретки //cLine := STRTRAN( cLine, CHR( 26 ), "" ) //cLine := STRTRAN( cLine, CHR( 10 ), "" ) //cLine := STRTRAN( cLine, CHR( 13 ), "" ) cLine := StrTran( cLine, Chr( 13 ) + Chr( 10 ), "" ) // WIN code page -> DOS code page // cLine := HB_AnsiToOem(cLine) AAdd( aFileDim, cLine ) // Запись в журнал для контроля STRFILE( cLine + CRLF, cFileJorn, .T. ) ENDDO FClose( hFile ) STRFILE("<< Конец файла >>"+CRLF+CRLF, cFileJorn, .T.) ENDIF // nSizeFile == 0 ENDIF // nStatus # 0 RETURN aFileDim /*** * * FReadLn( <nHandle>, [<nLines>], [<nLineLength>], [<cDelim>] ) --> cLines * * Считать одну или более строк из текстового файла * * ЗАМЕЧАНИЕ: * Длина строки включает символы разделители, поэтому максимальная * длина считанной строки равна (nLineLength - LEN( cDelim )) * * Возвращает строку с разделителями, если они были считаны * * nLines по умолчанию равна 1, nLineLength равна 256 и cDelim равен CRLF * * FERROR() должна проверить успешное завершение FReadLn() * * FReadLn() возвращает "" когда достигается EOF * */ FUNCTION FReadLn( nHandle, nLines, nLineLength, cDelim ) LOCAL nCurPos // Текущая позиция указателя в файле LOCAL nFileSize // Размер файла LOCAL nChrsToRead // Количество считанных символов LOCAL nChrsRead // Количество фактически прочитанных символов LOCAL cBuffer // Буффер для чтения файла LOCAL cLines // Возвращаемое значение, прочитанные строки LOCAL nCount // Количество прочитанных строк LOCAL nEOLPos // Позиция EOL в cBuffer DEFAULT nLines TO 1 DEFAULT nLineLength TO 256 DEFAULT cDelim TO ( Chr( 13 ) + Chr( 10 ) ) nCurPos := FilePos( nHandle ) nFileSize := FileSizeM( nHandle ) //? "Тек.позиция=",nCurPos, "Размер файла=",nFileSize //Inkey( 0 ) // Удостовериться, что не будет попытки прочесть за EOF nChrsToRead := Min( nLineLength, nFileSize - nCurPos ) cLines := '' nCount := 1 DO WHILE ( ( nCount <= nLines ) .AND. ( nChrsToRead != 0 ) ) cBuffer := Space( nChrsToRead ) nChrsRead := FRead( nHandle, @cBuffer, nChrsToRead ) // Проверяется условие ошибки IF ! ( nChrsRead == nChrsToRead ) // Ошибка! // Для того чтобы оставаться концептуально совместимым с другими // функциями низкого уровня, вынуждены заставить проверять пользователя // FERROR() ( кот. выше определена функцией FREAD() ) // для обнаружения этого факта // nChrsToRead := 0 ENDIF nEOLPos := At( cDelim, cBuffer ) // Обновить буффер и пазицию указателя файла IF ( nEOLPos == 0 ) cLines += Left( cBuffer, nChrsRead ) nCurPos += nChrsRead ELSE cLines += Left( cBuffer, ( nEOLPos + Len( cDelim ) ) - 1 ) nCurPos += ( nEOLPos + Len( cDelim ) ) - 1 FSeek( nHandle, nCurPos, FS_SET ) ENDIF // Убедимся, что не пытаемся прочесть за пределами EOF IF ( ( nFileSize - nCurPos ) < nLineLength ) nChrsToRead := ( nFileSize - nCurPos ) ENDIF nCount ++ ENDDO RETURN ( cLines ) /*** * * FEof( <nHandle> ) --> lBoundary * * Определить находится ли указатель на последнем байте файла * */ FUNCTION FEof( nHandle, nSay ) IF nSay == 1 ? ? FileSizeM( nHandle ) , " == ", FilePos( nHandle ) ENDIF RETURN ( IF( FileSizeM( nHandle ) == FilePos( nHandle ), .T., .F. ) ) /*** * * FilePos( <nHandle> ) --> nPos * * Возвращает текущую позицию указателя считывания для двоичного файла * */ FUNCTION FilePos( nHandle ) RETURN ( FSeek( nHandle, 0, FS_RELATIVE ) ) /*** * * FileSize( <nHandle> ) --> nBytes * * Return the size of a binary file * */ FUNCTION FileSizeM( nHandle ) LOCAL nCurrent LOCAL nLength // Get file position nCurrent := FilePos( nHandle ) // Get file length nLength := FSEEK( nHandle, 0, FS_END ) // Reset file position FSEEK( nHandle, nCurrent ) RETURN ( nLength ) //End file FileLoad.prg

Vlad04: Просто для построчного считывания текстового файла я использую конструкцию IF FILE(cFileName) cFileText := TFileRead():New( cFileName ) cFileText:Open() do WHILE cFileText:MoreToRead() cLine:= cFileText:ReadLine() .....


Andrey: Возвращаюсь опять к FileSize() Харбор 1.0.0 может и в других тоже. Не работает при обращении на другие диски ! Делаю пример: Запуск с диска D: ? FILE("Z:\TEST\tesd.dbf") -> .T. ? FILESIZE("Z:\TEST\tesd.dbf") -> 0 Сделал через FOPEN(), но это же не порядок !!! Будте любезны, сообщите на форум РАЗРАБОТЧИКАМ ....

Dima: Andrey пишет: Харбор 1.0.0 может и в других тоже 1.1 - OK Harbour 2.0.0 -OK PS Если надо могу налить куда нить Xharbour 1.1.0

Andrey: Dima пишет: Если надо могу налить куда нить Xharbour 1.1.0 Спасибо Дима. Но я пока привязан к 1.0.0 из терминала Alexander Prostoserdov (со шрифтами который), Терминал под 1.1.0 не собирается, прошу уж полгода сделать, а у него проблемы там большие... Вот пока и жду.

Pasha: Andrey пишет: Будте любезны, сообщите на форум РАЗРАБОТЧИКАМ .... В этом нет никакого смысла. Если: Dima пишет: 1.1 - OK Harbour 2.0.0 -OK То баг уже исправлен. Сообщать о том, что в когда-то в старой версии что-то не работало, бессмысленно

Dima: Andrey пишет: Терминал под 1.1.0 не собирается, прошу уж полгода сделать, а у него проблемы там большие... Вот пока и жду. Попробуй "ускорялки" , ну ты понял о чем я



полная версия страницы