Flex 3 & Air 2: автоматически определяет, когда файлы в каталоге обновляются - PullRequest
4 голосов
/ 27 июля 2010

Сумасшедшая идея просто упала с неба и ударила меня по голове xD. Мне было интересно, можно ли сделать так, чтобы приложение могло слушать, когда пользователь «добавляет» новые файлы в каталог.

Пример:

  1. Пользователь открывает наше приложение.
  2. Пользователь добавляет новые файлы на рабочий стол (с помощью Microsoft Explorer).
  3. Наше приложение автоматически обнаруживает, что были добавлены новые файлы, и выполняет функцию или что-либо еще.

Звучит интересно, верно?

Может быть, это можно сделать с помощью языка программирования, такого как Visual Basic, и открыть исполняемый файл с помощью API NativeProcess и прослушать событие stdOut ... (:

Кто-нибудь есть и идея поделиться с нами? :)

Спасибо Lombardi

Ответы [ 3 ]

0 голосов
/ 27 июля 2010

AIR может справиться с этим ...

класс FileSystemList запускает событие directoryChange всякий раз, когда файл в наблюдаемом каталоге изменяется.

Вы даже можете использовать его для наблюдения за монтируемыми дисками (я думаю, что Кристиан Кантрелл показал, что один выключен)

0 голосов
/ 24 мая 2012

1 отличное решение для Windows: используйте Visual Studio, создайте приложение .net, найденное здесь http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx В Adobe AIR используйте собственный процесс для прослушивания событий изменений, отправленных .net

0 голосов
/ 27 июля 2010

Хорошо, я думаю, что все ближе, проверьте это решение! :)

private var CheckDelay:Timer = new Timer(5000, 0);

private function InitApp():void
{
   CheckDelay.addEventListener(TimerEvent.Timer, CheckForNewFiles, false, 0, true);
   CheckDelay.start();
}

private function CheckForNewFiles(event:TimerEvent):void
{
   var FS:FileStream = new FileStream();
   var Buffer:File = File.applicationStorageDirectory.resolvePath("FilesBuffer.cmd");
   FS.open(Buffer, FileMode.Write);
   FS.writeUTFBytes("cd " + File.desktopDirectory.nativePath + "\r\n" + 
                     "dir /on /b > " + File.applicationStorageDirectory.resolvePath("FileList.txt").nativePath);
   FS.close();


   var Process:NativeProcess = new NativeProcess();
   var NPI:NativeProcessStartupInfo = NativeProcessStartupInfo(); // What a large name! xD
   NPI.executable = Buffer;
   Process.start(NPI);
   Process..addEventListener(NativeProcessExitEvent.EXIT, ReadFileList, false, 0, true);
} 

private function ReadFileList(event:Event):void
{
   var FS:FileStream = new FileStream();
   var Buffer:File = File.applicationStorageDirectory.resolvePath("FilesBuffer.cmd");
   FS.open(Buffer, FileMode.Read);
   var FileData:String = FS.readUTFBytes(FS.bytesAvailable);
   FS.close();

   var FileArray:Array = FileData.split("\r\n");

   var TempArray:ArrayCollection = new ArrayColletion();
   var TempFile:File;
   for(var i:int = 0;i<FileArray.length;i++){
    TempFile = new File(FileArray[i]);
    TempArray.addItem(TempFile);
   } 
}

В конце мы получили массив (TempArray), который мы могли бы использовать в сетке данных (например) с такими столбцами, как: «расширение, имя файла, FilePath и т. Д.»

Файлы обновляются каждые 5 секунд.

И почему мы используем весь этот код вместо простого «File.getDirectoryListing ()»? Поскольку мы обновляем наше приложение каждые 5 секунд, если зачем использовать getDirectoryListing (), наше приложение будет занимать гораздо больше оперативной памяти, а также команда cmd намного быстрее ...:)

Если у вас есть идея получше, поделитесь ею с нами! Спасибо! : D

...