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

S

seoman2

Lotus team
17.02.2010
480
1
Не подскажете, как прочитать в переменную концовку текста с файла на винте?
Что то не получается.

Вариант 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 меньше чем после открытия максимальное.
 
lmike

lmike

нет, пердело совершенство
Lotus team
27.08.2008
7 256
439
@seoman2 бесполезное занятие, вывод всегда кэшируется и только после сброса буферов или закрытия файлов - будут "правильные" значения
читать буфер др. процесса - это отдельная тема
 
lmike

lmike

нет, пердело совершенство
Lotus team
27.08.2008
7 256
439
да и чтение, в случае неизвестной длины делается в цикле Loop Until inStream.IsEOS
и с пом. Read (а не ReadText)
 
A

alexas1

Lotus team
10.04.2014
1 108
216
это всё к теме "как узнать, чо файл скачался"???
ващщета, никто не мешает традиционно считать файл "по записям" и взять последнюю:

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)
 
lmike

lmike

нет, пердело совершенство
Lotus team
27.08.2008
7 256
439
@alexas1 особенность случая в том что можно прочитать до того - как завершится запись полностью...
можно список процессов посмотреть и отлавливать когда процессы закроют файл
 
A

alexas1

Lotus team
10.04.2014
1 108
216
можно список процессов посмотреть и отлавливать когда процессы закроют файл
это без проблем, ток файло может и не закрыться из-за какогонить гемора
такая асинхронность, при контроле снаружи проги, кот пишет, не даст возможности построить вменяемую логику - как отличить гемор от "просто ещё не докачался"?
я никакого надёжного реалтайма, в этом случае не вижу
а если втыкать таймаут, тогда и контролировать после его окончания, тут всё просто - длина файлы на диске
------------------
можно ещё периодически контролировать размер файлы и если он перестал изменяться, в течении какого то времени, не достигнув нужного размера - ругаться и прекратить его ждать
всё равно таймаут нужен
 
Последнее редактирование:
S

seoman2

Lotus team
17.02.2010
480
1
У меня есть файл, я хочу проверить, есть ли в конце файла текст "<qwer>"
Что доделать?
Do
xxx= outputStream.Read
Forall b In xxx
bb = b
End Forall
Loop Until outputStream.IsEOS
 
lmike

lmike

нет, пердело совершенство
Lotus team
27.08.2008
7 256
439
У меня есть файл, я хочу проверить, есть ли в конце файла текст "<qwer>"
Что доделать?
Do
xxx= outputStream.Read
Forall b In xxx
bb = b
End Forall
Loop Until outputStream.IsEOS
выше уже описали - может никогда такое не случится!
алгоритм нерабочий
 
lmike

lmike

нет, пердело совершенство
Lotus team
27.08.2008
7 256
439
@seoman2 яже расписал ситуевину...
представим - выгрузили файл открыли стороннюю прогу, запустили свой таймер...
и что же мы там будем делать:
  • крутить в цикле перебор файла? - ну это мрак, с т.з. архитектуры, будет бестолковый IO
  • запустим один раз перебор - но мы гарантировано не попадем на закрытие программы, и стало-быть - не получим конец файла
исходя из вышеизложенного - взять рабочий код на java, кот. мониторит события в файловой системе - и не будет никаких если
 
lmike

lmike

нет, пердело совершенство
Lotus team
27.08.2008
7 256
439
Ждать появления файла.
Если появился - то уже его читать и смотреть, что в его конце.
это уже обсуждалось...
что мешает?
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();
            }

        }

    }
}
 
lmike

lmike

нет, пердело совершенство
Lotus team
27.08.2008
7 256
439
в домине ставить хук на загашение ВМ не нужно, т.е. кусок с Runtime
 
R

rinsk

Lotus team
12.11.2009
1 049
86
реакция зависит от того как программа-писака это файл открыла
Не важно как писака открыл файл, важно, что проверить занятость файла можно попробовав открыть его в эксклюзивном режиме. В случае ошибки - да, кто то его как то открыл.
Но судя по всему задачи такой не ставится, ставится задача проверки успешности исполнения другой программы посредством чтения ее сигнатуры в файле.
 
A

alexas1

Lotus team
10.04.2014
1 108
216
Не важно как писака открыл файл, важно, что проверить занятость файла можно попробовав открыть его в эксклюзивном режиме. В случае ошибки - да, кто то его как то открыл.
Но судя по всему задачи такой не ставится, ставится задача проверки успешности исполнения другой программы посредством чтения ее сигнатуры в файле.
Вряд ли, если писака не выставил монопольный флаг, другая прога паюбэ его откроет и если в монополе, то писака обломится при очередном обновлении файлы
 
Мы в соцсетях:  ТелеграмВконтактеДзенФейсбукТвиттерЮтуб