2016-06-17 12 views
0

Ich habe diese FileSystemList, die offensichtlich Dateien aus einem angegebenen Verzeichnis auflisten. Alles funktioniert gut, außer dass ich den Eintrag basierend auf dem Erstellungsdatum für die Dateien sortieren möchte.FileSystemList Sortieren nach Datum

Ist dies für eine FileSystemList möglich?

Antwort

1

Standardmäßig können Sie nur nach dem Dateinamen über die Eigenschaft nameCompareFunction sortieren. Leider ist die API der FileSystem * -Steuerelemente nicht gut für die Erweiterbarkeit oder Anpassung geeignet. So werden die Dinge, die ein "wenig" komplizierter, und Sie müssen stammen aus FileSystemList:

com.stackoverflow.MyFileSystemList

package com.stackoverflow 
{ 
    import mx.controls.FileSystemList; 
    import mx.core.mx_internal; 

    use namespace mx_internal; 

    public class MyFileSystemList extends FileSystemList 
    { 
     public function MyFileSystemList() 
     { 
      super(); 
      // overwrite the FileSystemControlHelper instance     
      helper = new MyFileSystemControlHelper(this, false); 
      iconFunction = helper.fileIconFunction; 
      labelFunction = helper.fileLabelFunction; 
      directory = COMPUTER; 
     } 

     public function set fileCompareFunction(value:Function): void 
     { 
      MyFileSystemControlHelper(helper).fileCompareFunction = value; 
     } 

     public function get fileCompareFunction():Function 
     { 
      return MyFileSystemControlHelper(helper).fileCompareFunction; 
     } 
    } 
} 

com.stackoverflow.MyFileSystemControlHelper

package com.stackoverflow 
{ 
    import mx.controls.fileSystemClasses.FileSystemControlHelper; 
    import mx.core.mx_internal; 

    use namespace mx_internal; 

    public class MyFileSystemControlHelper extends FileSystemControlHelper 
    { 
     public function MyFileSystemControlHelper(owner:Object, hierarchical:Boolean) 
     { 
      super(owner, hierarchical);     
      directoryEnumeration = new MyDirectoryEnumeration(); 
     } 

     private var _customFileCompareFunction:Function;    
     private var customFileCompareFunctionChanged:Boolean = false; 

     public function set fileCompareFunction(value:Function): void 
     { 
      _customFileCompareFunction = value; 
      customFileCompareFunctionChanged = true; 
      owner.invalidateProperties(); 
     } 

     public function get fileCompareFunction():Function 
     { 
      return _customFileCompareFunction; 
     } 

     override public function commitProperties():void 
     { 
      super.commitProperties();     
      if (customFileCompareFunctionChanged) 
      { 
       MyDirectoryEnumeration(directoryEnumeration).customFileCompareFunction = fileCompareFunction; 
       directoryEnumeration.refresh(); 
       owner.dataProvider = directoryEnumeration.collection; 
       itemsChanged(); 
       customFileCompareFunctionChanged = false; 
      } 
     } 
    } 
} 

com.stackoverflow .MyDirectoryEnumeration

package com.stackoverflow 
{ 
    import flash.filesystem.File; 

    import mx.utils.DirectoryEnumeration; 
    import mx.utils.DirectoryEnumerationMode; 

    public class MyDirectoryEnumeration extends DirectoryEnumeration 
    { 
     public function MyDirectoryEnumeration(source:Array = null) 
     { 
      super(source); 
     } 

     private var _fileCompareFunction:Function; 

     public function get customFileCompareFunction(): Function 
     { 
      return _fileCompareFunction; 
     } 

     public function set customFileCompareFunction(value: Function):void 
     { 
      _fileCompareFunction = value; 
     } 

     override public function fileCompareFunction(file1:File, file2:File, fields:Array=null):int 
     { 
      if (_fileCompareFunction == null) 
       return super.fileCompareFunction(file1, file2, fields); 

      if (file1.isDirectory && !file2.isDirectory) 
      { 
       if (enumerationMode == DirectoryEnumerationMode.DIRECTORIES_FIRST) 
        return -1; 
       if (enumerationMode == DirectoryEnumerationMode.FILES_FIRST) 
        return 1; 
      } 

      if (!file1.isDirectory && file2.isDirectory) 
      { 
       if (enumerationMode == DirectoryEnumerationMode.DIRECTORIES_FIRST) 
        return 1; 
       if (enumerationMode == DirectoryEnumerationMode.FILES_FIRST) 
        return -1; 
      } 

      return _fileCompareFunction(file1, file2); 
     } 
    } 
} 

Danach können Sie Ihre MyFileSystemList Komponente verwenden und Ihre eigene Funktion, die Dateien auf dem Erstellungsdatum, miteinander vergleichen bieten zu sortieren:

<?xml version="1.0" encoding="utf-8"?> 
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:stackoverflow="com.stackoverflow.*"> 

    <stackoverflow:MyFileSystemList fileCompareFunction="compareFiles"/> 

<fx:Script><![CDATA[ 
    private function compareFiles(file1:File, file2:File):int 
    { 
     if (file1.creationDate.time > file2.creationDate.time) 
      return 1; 
     else 
      return -1; 
    } 

]]></fx:Script> 
</s:WindowedApplication> 
+0

Thanx! Sieht sehr vielversprechend aus! Ich schaue es dir an und melde mich später mit einem "Bericht" ;-) – Nicke

+0

Ich habe deine Lösung implementiert und es funktioniert prima! Danke, das war ein Lebensretter! :-) – Nicke