Чтение и работа с файлами с диска

Тема в разделе "Lotus - Программирование", создана пользователем seoman2, 10 авг 2016.

  1. seoman2

    seoman2 Lotus team
    Lotus team

    Регистрация:
    17 фев 2010
    Сообщения:
    435
    Симпатии:
    0
    Не подскажете, как прочитать в переменную концовку текста с файла на винте?
    Что то не получается.

    Вариант 1:
    FNum = Freefile()
    Open mypatch$ For Output As FNum ' Почему то делает файл размером 0 байт
    myseek$ = Seek (FNum) ' получаю текущюю позицию, а как узнать конечную - не знаю.
    Print myseek$ & " seek"
    Close FNum


    А вариант 2 с потоком:
    Dim pos As Long
    Call outputStream.Open(mypatch$, "UTF-8")
    xxx$=outputStream.Readtext() ' только так умею сместить позицию outputStream.position в конец потока
    pos = outputStream.position -10
    outputStream.position = pos
    ууу$=outputStream.Readtext()
    Msgbox ууу$

    Выдает краказяблы. Причем в дебагере outputStream.position у "pos" на 10 меньше чем после открытия максимальное.
     
  2. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.082
    Симпатии:
    300
    @seoman2 бесполезное занятие, вывод всегда кэшируется и только после сброса буферов или закрытия файлов - будут "правильные" значения
    читать буфер др. процесса - это отдельная тема
     
  3. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.082
    Симпатии:
    300
    да и чтение, в случае неизвестной длины делается в цикле Loop Until inStream.IsEOS
    и с пом. Read (а не ReadText)
     
  4. alexas1

    alexas1 Lotus team
    Lotus team

    Регистрация:
    10 апр 2014
    Сообщения:
    567
    Симпатии:
    214
    это всё к теме "как узнать, чо файл скачался"???
    ващщета, никто не мешает традиционно считать файл "по записям" и взять последнюю:

    Dim text As String, fileNum As Integer
    fileNum% = Freefile()

    Open "c:\моё файло" For Input As fileNum%

    Do Until Eof(1)
    Line Input #1, text$
    Print text$
    Loop
    Close fileNum%
    -----------------------
    кста, EOF не обязательно присутствует в конце файла, хоть и скачанного "до конца" (если предполагается искать %%EOF)
     
  5. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.082
    Симпатии:
    300
    @alexas1 особенность случая в том что можно прочитать до того - как завершится запись полностью...
    можно список процессов посмотреть и отлавливать когда процессы закроют файл
     
  6. alexas1

    alexas1 Lotus team
    Lotus team

    Регистрация:
    10 апр 2014
    Сообщения:
    567
    Симпатии:
    214
    это без проблем, ток файло может и не закрыться из-за какогонить гемора
    такая асинхронность, при контроле снаружи проги, кот пишет, не даст возможности построить вменяемую логику - как отличить гемор от "просто ещё не докачался"?
    я никакого надёжного реалтайма, в этом случае не вижу
    а если втыкать таймаут, тогда и контролировать после его окончания, тут всё просто - длина файлы на диске
    ------------------
    можно ещё периодически контролировать размер файлы и если он перестал изменяться, в течении какого то времени, не достигнув нужного размера - ругаться и прекратить его ждать
    всё равно таймаут нужен
     
    #6 alexas1, 10 авг 2016
    Последнее редактирование: 10 авг 2016
  7. seoman2

    seoman2 Lotus team
    Lotus team

    Регистрация:
    17 фев 2010
    Сообщения:
    435
    Симпатии:
    0
    У меня есть файл, я хочу проверить, есть ли в конце файла текст "<qwer>"
    Что доделать?
    Do
    xxx= outputStream.Read
    Forall b In xxx
    bb = b
    End Forall
    Loop Until outputStream.IsEOS
     
  8. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.082
    Симпатии:
    300
    выше уже описали - может никогда такое не случится!
    алгоритм нерабочий
     
  9. seoman2

    seoman2 Lotus team
    Lotus team

    Регистрация:
    17 фев 2010
    Сообщения:
    435
    Симпатии:
    0
    А какой рабочий алгоритм?
    в итоге в text$ будет последняя строка... А как бы её сразу получить?
     
  10. alexas1

    alexas1 Lotus team
    Lotus team

    Регистрация:
    10 апр 2014
    Сообщения:
    567
    Симпатии:
    214
    тут никак - файл читается последовательно, т.е. Eof говорит, чо данные кончились и поезд ушол
     
  11. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.082
    Симпатии:
    300
    @seoman2 яже расписал ситуевину...
    представим - выгрузили файл открыли стороннюю прогу, запустили свой таймер...
    и что же мы там будем делать:
    • крутить в цикле перебор файла? - ну это мрак, с т.з. архитектуры, будет бестолковый IO
    • запустим один раз перебор - но мы гарантировано не попадем на закрытие программы, и стало-быть - не получим конец файла
    исходя из вышеизложенного - взять рабочий код на java, кот. мониторит события в файловой системе - и не будет никаких если
     
  12. seoman2

    seoman2 Lotus team
    Lotus team

    Регистрация:
    17 фев 2010
    Сообщения:
    435
    Симпатии:
    0
    Ждать появления файла.
    Если появился - то уже его читать и смотреть, что в его конце.
     
  13. rinsk

    rinsk Lotus team
    Lotus team

    Регистрация:
    12 ноя 2009
    Сообщения:
    797
    Симпатии:
    78
    Пробовали открыть файл на чтение в эксклюзивном режиме или нет?:)
    PS - интересно, чем оно закончится...:))
     
  14. alexas1

    alexas1 Lotus team
    Lotus team

    Регистрация:
    10 апр 2014
    Сообщения:
    567
    Симпатии:
    214
    реакция зависит от того как программа-писака это файл открыла
     
  15. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.082
    Симпатии:
    300
    это уже обсуждалось...
    что мешает?
    Код (Java):
    import org.apache.commons.vfs2.FileChangeEvent;
    import org.apache.commons.vfs2.FileListener;

    /**
    * Created by mike on 09.08.16.
    */

    public class CustomFileListener implements FileListener {
        @Override
        public void fileCreated(FileChangeEvent fileChangeEvent) throws Exception {
        }

        @Override
        public void fileDeleted(FileChangeEvent fileChangeEvent) throws Exception {

        }

        @Override
        public void fileChanged(FileChangeEvent fileChangeEvent) throws Exception {
            System.out.println("changed");

        }
    }
    import org.apache.commons.vfs2.FileObject;
    import org.apache.commons.vfs2.FileSystemException;
    import org.apache.commons.vfs2.FileSystemManager;
    import org.apache.commons.vfs2.VFS;
    import org.apache.commons.vfs2.impl.DefaultFileMonitor;

    /**
    * Created by mike on 09.08.16.
    */

    public class VFSMonitor {
        public static void main(String[] args) throws FileSystemException {
            FileSystemManager fsManager = VFS.getManager();
            FileObject listendir = fsManager.resolveFile("/home/mike/testmon.txt");

            final DefaultFileMonitor fm = new DefaultFileMonitor(new CustomFileListener());
            fm.setRecursive(false);
            fm.addFile(listendir);
            fm.start();
            Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {

                @Override
                public void run() {
                    try {
                        System.out.println("Stopping monitor.");
                        fm.stop();
                    } catch (Exception ignored) {
                    }
                }
            }));
            int i = 1;
            while (i == 1) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }

        }
    }
     
     
  16. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.082
    Симпатии:
    300
    в домине ставить хук на загашение ВМ не нужно, т.е. кусок с Runtime
     
  17. rinsk

    rinsk Lotus team
    Lotus team

    Регистрация:
    12 ноя 2009
    Сообщения:
    797
    Симпатии:
    78
    Не важно как писака открыл файл, важно, что проверить занятость файла можно попробовав открыть его в эксклюзивном режиме. В случае ошибки - да, кто то его как то открыл.
    Но судя по всему задачи такой не ставится, ставится задача проверки успешности исполнения другой программы посредством чтения ее сигнатуры в файле.
     
  18. alexas1

    alexas1 Lotus team
    Lotus team

    Регистрация:
    10 апр 2014
    Сообщения:
    567
    Симпатии:
    214
    Вряд ли, если писака не выставил монопольный флаг, другая прога паюбэ его откроет и если в монополе, то писака обломится при очередном обновлении файлы
     
  19. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.082
    Симпатии:
    300
    вот для этого и подходи трогательный момент закрытия файла (т.е. фактического изменения в ФС)
     
  20. alexas1

    alexas1 Lotus team
    Lotus team

    Регистрация:
    10 апр 2014
    Сообщения:
    567
    Симпатии:
    214
    ХЗ как писака пишет, может и порциями с "фактическим изменением в ФС" каждый раз, так куча даунлоадеров работает
     
Загрузка...

Поделиться этой страницей