文件系统列表按日期进行排序



我已经有了这个文件系统列表,显然是从指定目录列出了文件。一切都很好,除了我想根据文件的创建日期对列表进行排序。

FileSystemList

这是可能的

盒子外,您只能通过nameCompareFunction属性按文件名进行排序。不幸的是,Filesystem*控件的API并非用于扩展性或自定义。因此,事物变得更加复杂,您必须源自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);
        }
    }
}

之后,您可以使用MyFileSystemList组件并提供自己的比较函数来根据创建日期对文件进行排序:

<?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>

最新更新