FileSystemList按日期排序

时间:2016-06-17 11:47:03

标签: actionscript-3 flex air

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

这可能是FileSystemList吗?

1 个答案:

答案 0 :(得分:1)

开箱即用,您只能通过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>