Dir Stat to CSV

De Wiki Clusterlab.com.br
Revisão de 19h14min de 5 de abril de 2021 por Damato (discussão | contribs)
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)
Ir para navegação Ir para pesquisar

C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.AccessControl;
using System.Security.Principal;

namespace GetTreeDateAndSize.Tree
{
    public class FileData
    {
        public string dirPath;
        public string name;
        public double size;
        public DateTime creationTime;
        public DateTime accessTime;
        public DateTime writeTime;
        public void SetDirPath(string dirPath)
        {
            this.dirPath = dirPath;
        }
        public void SetName(string name)
        {
            this.name = name;
        }
        public void SetSize(double size)
        {
            this.size = size;
        }
        public void SetCreationTime(DateTime criationTime)
        {
            this.creationTime = criationTime;
        }
        public void SetAccessTime(DateTime accessTime)
        {
            this.accessTime = accessTime;
        }
        public void SetWriteTime(DateTime writeTime)
        {
            this.writeTime = writeTime;
        }
        public string GetDirPath()
        {
            return this.dirPath;
        }
        public string GetName()
        {
            return this.name;
        }
        public double GetSize()
        {
            return this.size;
        }
        public DateTime GetCreationTime()
        {
            return this.creationTime;
        }
        public DateTime GetAccessTime()
        {
            return accessTime;
        }
        public DateTime GetWriteTime()
        {
            return writeTime;
        }

    }
    
    public class Tree
    {
        public List<string> GetDirACL(string directory,bool explicitACL, bool inheritedACL)
        {
            List<string> myACLs = new List<string>();
            try
            {
                DirectoryInfo myDir = new DirectoryInfo(directory);
                DirectorySecurity acls = myDir.GetAccessControl(AccessControlSections.All);
                AuthorizationRuleCollection rules = acls.GetAccessRules(explicitACL, inheritedACL, typeof(NTAccount));
                foreach (AuthorizationRule rule in  rules)
                {
                    myACLs.Add(rule.IdentityReference.ToString());
                }

            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }

            return myACLs;
        }

        public IEnumerable<string> GetDirs(string directory)
        {
            IEnumerable<string> directories = new List<string>();
            try
            {
                directories = Directory.EnumerateDirectories(directory, "*.*");
                
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            return directories;
        }

        public double GetDirTotalSize(List<FileData> fileDatas)
        {
            double totalSize = 0;
            foreach (FileData fileData in fileDatas)
            {
                totalSize = totalSize + fileData.GetSize();
            }

            return totalSize;
        }

        public DateTime GetLastDateTime(DateTime t1, DateTime t2)
        {
            if (DateTime.Compare(t1, t2) > 0)
            {
                return t1;
            }
            else
            {
                return t2;
            }
        }
        public DateTime GetLastAccessDateTime(List<FileData> fileDatas)
        {
            DateTime lastData = new DateTime(1900, 1, 1, 1, 0, 0);
            
            foreach (FileData fileData in fileDatas)
            {
                lastData = this.GetLastDateTime(lastData, fileData.GetAccessTime());
            }

            return lastData;
        }
        public DateTime GetLastWriteDateTime(List<FileData> fileDatas)
        {
            DateTime lastData = new DateTime(1900, 1, 1, 1, 0, 0);
            
            foreach (FileData fileData in fileDatas)
            {
                lastData = this.GetLastDateTime(lastData, fileData.GetWriteTime());
            }

            return lastData;
        }
        public DateTime GetLastCreateDateTime(List<FileData> fileDatas)
        {
            DateTime lastData = new DateTime(1900, 1, 1, 1, 0, 0);
            
            foreach (FileData fileData in fileDatas)
            {
                lastData = this.GetLastDateTime(lastData, fileData.GetCreationTime());
            }

            return lastData;
        }
        public List<FileData> GetDirDetails(string directory)
        {
            List<FileData> fileDatas = new List<FileData>();

            try
            {
                IEnumerable<string> myFiles = Directory.EnumerateFiles(directory, "*.*");

                foreach (string myFile in myFiles)
                {
                    FileInfo myFileInfo = new FileInfo(myFile);
                    FileData fileData = new FileData();
                    fileData.SetName(myFileInfo.Name);
                    fileData.SetSize(myFileInfo.Length);
                    fileData.SetDirPath(myFileInfo.DirectoryName);
                    fileData.SetAccessTime(myFileInfo.LastAccessTimeUtc);
                    fileData.SetWriteTime(myFileInfo.LastWriteTimeUtc);
                    fileData.SetCreationTime(myFileInfo.CreationTimeUtc);
                    fileDatas.Add(fileData);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }

            return fileDatas;
        }
        
        public FileData GetDirStatCSV(string directory)
        {
            IEnumerable<string> directories = new List<string>();
            FileData myData =new FileData();
            myData.SetSize(0);
            DateTime oldDate = new DateTime(1900, 1, 1, 1, 0, 0);
            myData.SetCreationTime(oldDate);
            myData.SetAccessTime(oldDate);
            myData.SetWriteTime(oldDate);

            try
            {
                directories = this.GetDirs(directory);
                if (directories.Count() != 0)
                {
                    foreach (string MyDir in directories)
                    {
                        FileData mySubDir = this.GetDirStatCSV(MyDir);
                        myData.SetSize(myData.GetSize() + mySubDir.GetSize());
                        myData.SetAccessTime(this.GetLastDateTime(myData.GetAccessTime(),mySubDir.GetAccessTime()));
                        myData.SetWriteTime(this.GetLastDateTime(myData.GetWriteTime(),mySubDir.GetWriteTime()));
                        myData.SetCreationTime(this.GetLastDateTime(myData.GetCreationTime(),mySubDir.GetCreationTime()));
                    }
                    List<FileData> fileDatas = this.GetDirDetails(directory);
                    myData.SetSize(myData.GetSize() + this.GetDirTotalSize(fileDatas));
                    myData.SetAccessTime(this.GetLastDateTime(myData.GetAccessTime(),this.GetLastAccessDateTime(fileDatas)));
                    myData.SetWriteTime(this.GetLastDateTime(myData.GetWriteTime(),this.GetLastAccessDateTime(fileDatas)));
                    myData.SetCreationTime(this.GetLastDateTime(myData.GetCreationTime(),this.GetLastAccessDateTime(fileDatas)));
                }
                else
                {
                    List<FileData> fileDatas = this.GetDirDetails(directory);
                    myData.SetSize(myData.GetSize() + this.GetDirTotalSize(fileDatas));
                    myData.SetAccessTime(this.GetLastDateTime(myData.GetAccessTime(),this.GetLastAccessDateTime(fileDatas)));
                    myData.SetWriteTime(this.GetLastDateTime(myData.GetWriteTime(),this.GetLastAccessDateTime(fileDatas)));
                    myData.SetCreationTime(this.GetLastDateTime(myData.GetCreationTime(),this.GetLastAccessDateTime(fileDatas)));
                }

                string aclsInherited = "";
                int aclInherited_count = 0;
                foreach (string acl in this.GetDirACL(directory,false,true))
                {
                    if (aclInherited_count == 0)
                    {
                        aclsInherited = acl;
                        aclInherited_count = 1;
                    }
                    else
                    {
                        aclsInherited = aclsInherited + "," + acl;
                    }
                    
                }
                string aclsExplicit = "";
                int aclExplicit_count = 0;
                foreach (string acl in this.GetDirACL(directory,true,false))
                {
                    if (aclExplicit_count == 0)
                    {
                        aclsExplicit = acl;
                        aclExplicit_count = 1;
                    }
                    else
                    {
                        aclsExplicit = aclsExplicit + "," + acl;
                    }
                    
                }
                Console.WriteLine(directory + ";" + 
                                  myData.GetSize() + ";" + 
                                  myData.GetAccessTime() + ";" + 
                                  myData.GetWriteTime() + ";" + 
                                  myData.GetCreationTime() + ";" + 
                                  aclsInherited + ";" + 
                                  aclsExplicit);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }

            return myData;
        }
        
        
        
        public void PrintTreeDir(string targetDirectory)
        {
            IEnumerable<string> directories = new List<string>();
            try
            {
                directories = this.GetDirs(targetDirectory);
                Console.WriteLine(targetDirectory);
                
                if (directories.Count() != 0)
                {
                    foreach (string dirObject in directories)
                    {
                        this.PrintTreeDir(dirObject);
                    }
                    this.PrintTreeFiles(targetDirectory);
                }
                else
                {
                    this.PrintTreeFiles(targetDirectory);
                }
                
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
        public void PrintTreeFiles(string targetDirectory)
        {
            try
            {
                var myFiles = Directory.EnumerateFiles(targetDirectory, "*.*");
                foreach (var myFile in myFiles)
                {
                    FileInfo fileData = new FileInfo(myFile);
                    Console.WriteLine(fileData.FullName + " " + fileData.LastAccessTimeUtc + " " + fileData.Length);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }
}