Search code examples
c#azureazure-storageazure-storage-files

How to use OrderByDescending on Properties using IListFileItem?


I have following code which will return all list items (files and folders) of specific given azure storage path.

I want to filter it using OrderByDescending based on Property LastModified

How to achieve this ?

 // Get list of all files/directories on the file share 
CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["storageConnectionString"]);
CloudFileClient fileClient = cloudStorageAccount.CreateCloudFileClient();
CloudFileShare fileShare = fileClient.GetShareReference(ConfigurationManager.AppSettings["shareName"]);

var sourceName = fileShare.GetRootDirectoryReference().GetDirectoryReference((ConfigurationManager.AppSettings["sourceName"]));
IEnumerable<IListFileItem> fileList = sourceName.ListFilesAndDirectories();
var test = (fileList.OrderByDescending(t => t.Uri.AbsolutePath).FirstOrDefault());

I tried with casting but LastModified is null

            fileList.ToList().ForEach(x => ((CloudFileDirectory)x).FetchAttributes());
GetAllSubDir(fileList.OrderByDescending(t => ((CloudFileDirectory)t).Properties.LastModified.Value).FirstOrDefault());

instead of Uri.AbsolutePath I want to use LastModified.


Solution

  • Have a try at following code. You need to get all files first because ListFilesAndDirectories only returns files and directory in a single level.

        List<CloudFile> list = new List<CloudFile>();
    
        public void Test()
        {
            CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["storageConnectionString"]);
            CloudFileClient fileClient = cloudStorageAccount.CreateCloudFileClient();
            CloudFileShare fileShare = 
            fileClient.GetShareReference(ConfigurationManager.AppSettings["shareName"]);
    
            var sourceName = fileShare.GetRootDirectoryReference().GetDirectoryReference((ConfigurationManager.AppSettings["sourceName"]));
            IEnumerable<IListFileItem> fileList = sourceName.ListFilesAndDirectories();
            listFile(fileList);
    
            var test = (from file in list
                          orderby file.Properties.LastModified descending
                          select file).FirstOrDefault();
    
        }
    
        // detect all files in the directory
        public void listFile(IEnumerable<IListFileItem> results)
        {
            foreach (IListFileItem fileItem in results)
            {
                if (fileItem.GetType() == typeof(CloudFileDirectory))
                {
                    CloudFileDirectory directory = (CloudFileDirectory)fileItem;
                    var res = directory.ListFilesAndDirectories();
                    listFile(res);
                }
                else
                {
                    CloudFile file = (CloudFile)fileItem;
                    file.FetchAttributes();
                    list.Add(file);
                }
            }
        }