На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: maxim84_
  
> Работа с файловой системой
    Простой пример работы с файловой системой. В частности - подсчет количества строк в файлах с определенным расширением в определенной папке и ее подпапках:
    1. Рекурсивный обход подпапок в пути, определение файлов по расширению:
    ExpandedWrap disabled
      private string strExtention = ".cs";
      private int rowCount = 0;
       
      private void ScanDirectory(DirectoryInfo dir){
          FileInfo[] files = dir.GetFiles();
          for(int i = 0; i < files.Length; i++){
              if(files[i].Extension == strExtention){
                  //если расширение совпадает - подсчитываю кол-во строк(код ниже)
                  rowCount += CalcOneFile(files[i]);
              }
          }
          DirectoryInfo[] dirs = dir.GetDirectories();
          for(int i = 0; i < dirs.Length; i++){
              //рекурсивный вызов сканирования для подпапок
              ScanDirectory(dirs[i]);
          }
      }

    2. Подсчет кол-ва строк в файле:
    ExpandedWrap disabled
      private int CalcOneFile(FileInfo file){
          int count = 0;
          StreamReader sr = file.OpenText();
          while(sr.ReadLine() != null){
              count ++;
          }
          sr.Close();
          return count;
      }

    3. И сам пример самого вызова сканирования:
    ExpandedWrap disabled
      FolderBrowserDialog dlg = new FolderBrowserDialog();
      if(dlg.ShowDialog(this) == DialogResult.OK){
          ScanDirectory(dlg.SelectedPath);
      }

    PS:
    ExpandedWrap disabled
      using System.Windows.Forms;
      using System.IO;


    Это сообщение было перенесено сюда или объединено из темы "Работа с файловой системой"
    Сообщение отредактировано: vot -
      Часто возникает задача - работа с файловой системой. Вот решение этой задачи:
      1. Подключаем System.IO. Создаем на форме TreeView, WebBrowser(можно использовать ListView или ListBox, их надо будет заполнять аналогично TreeView), ContextMenuStrip с двумя кнопками(удалить создать папку), 2 TextBox'а и ImageList.
      В ImageList добавить картинки папок(открытая/закрытая, 2 скрытых папки(открытая/закрытая)), компьютера, CDRom'а и жесткого диска.
      2. При загрузке формы заполняем TreeView:
      ExpandedWrap disabled
         private void PopulateTreeView()
                {
                    //
                    // My Computer
                    //
                    TreeNode MyComputer = new TreeNode("My Computer", 4, 4);
                    MyComputer.Name = "My Computer";
                    this.treeView.Nodes.Add(MyComputer);
                    TreeNode RootNode;
                    DriveInfo[] AllDrivers = DriveInfo.GetDrives();
                    foreach (DriveInfo d in AllDrivers)
                    {
                        DirectoryInfo DirInfo = new DirectoryInfo(d.Name);
                        RootNode = new TreeNode(DirInfo.Name);
                        switch (d.DriveType)
                        {
                            case DriveType.Fixed:
                                RootNode.ImageIndex = 6;
                                RootNode.SelectedImageIndex = 6;
                                break;
                            case DriveType.CDRom:
                                RootNode.ImageIndex = 5;
                                RootNode.SelectedImageIndex = 5;
                                break;
                            default:
                                RootNode.ImageIndex = 0;
                                RootNode.SelectedImageIndex = 1;
                                break;
                        }
                        RootNode.ContextMenuStrip = this.contextMenuStrip;
                        MyComputer.Nodes.Add(RootNode);
                        if (DirInfo.Exists)
                        {
                            // Create FileSystemWatcher
                            FileSystemWatcher fileSystemWatcher = new FileSystemWatcher();
                            fileSystemWatcher.IncludeSubdirectories = true;
                            fileSystemWatcher.Path = d.RootDirectory.Name;
                            fileSystemWatcher.EnableRaisingEvents = true;
                            fileSystemWatcher.SynchronizingObject = this;
                            fileSystemWatcher.Created += new System.IO.FileSystemEventHandler(this.OnCreated);
                            fileSystemWatcher.Deleted += new System.IO.FileSystemEventHandler(this.OnDeleted);
                            fileSystemWatcher.Renamed += new System.IO.RenamedEventHandler(this.OnRenamed);
                            //
                            RootNode.Tag = DirInfo;
                            GetDirectories(DirInfo.GetDirectories(), RootNode);//получаем все папки на диске
                        }
                    }
                    //
                    // My Documents
                    //
                    TreeNode MyDoc = new TreeNode("My Documents");
                    MyDoc.ContextMenuStrip = this.contextMenuStrip;
                    DirectoryInfo diMyDoc = new DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments));//Получаем путь к MyDoc
                    MyDoc.Tag = diMyDoc;
                    this.treeView.Nodes.Add(MyDoc);
                    GetDirectories(diMyDoc.GetDirectories(), MyDoc);//получаем все папки в MyDoc
                }
         
                private void GetDirectories(DirectoryInfo[] subDirs, TreeNode nodeToAddTo)
                {
                    TreeNode aNode;
                    DirectoryInfo[] subSubDirs;
                    foreach (DirectoryInfo subDir in subDirs)
                    {
                        aNode = new TreeNode(subDir.Name);
                        if (subDir.Attributes == (FileAttributes.Hidden|FileAttributes.Directory))
                        {
                            aNode.ImageIndex = 2;
                            aNode.SelectedImageIndex = 3;
                        }
                        else
                        {
                            aNode.ImageIndex = 0;
                            aNode.SelectedImageIndex = 1;
                        }
                        aNode.Tag = subDir;
                        aNode.ContextMenuStrip = this.contextMenuStrip;
                        subSubDirs = subDir.GetDirectories();
                        if (subSubDirs.Length != 0)
                        {
                            GetDirectories(subSubDirs, aNode);
                        }
                        nodeToAddTo.Nodes.Add(aNode);
                    }
                }

      Обрабатываем сообщения fileSystemWatcher:
      ExpandedWrap disabled
        private void OnRenamed(object sender, RenamedEventArgs e)// переименование папки
                {
                    FileInfo fileInfo = new FileInfo(e.FullPath);
                    if (fileInfo.Attributes == FileAttributes.Directory)
                    {
                        String path = e.OldFullPath;
                        RenameNode(this.treeView.Nodes, path, e.Name, fileInfo);
                        path = path.Replace(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "My Documents");
                        RenameNode(this.treeView.Nodes, path, e.Name, fileInfo);
                    }
                }
         
                private void RenameNode(TreeNodeCollection nodeCollection, String oldFullPath, String name, FileInfo fileInfo)//переименование TreeNode
                {
                    String path;
                    foreach (TreeNode subNode in nodeCollection)
                    {
                        path = ((DirectoryInfo)subNode.Tag).FullName;
                        if (path == oldFullPath)
                        {
                            subNode.Name = name.Substring(name.LastIndexOf(treeView.PathSeparator) + 1);
                            subNode.Text = name.Substring(name.LastIndexOf(treeView.PathSeparator) + 1);
                            subNode.Tag = fileInfo;
                        }
                        if (subNode.Nodes.Count != 0)
                        {
                            RenameNode(subNode.Nodes, oldFullPath, name, fileInfo);
                        }
                    }
                }
                
                private void OnCreated(object sender, FileSystemEventArgs e)//создание папки
                {
                    FileInfo fileInfo = new FileInfo(e.FullPath);
                    if (fileInfo.Attributes == FileAttributes.Directory)
                    {
                        String path = e.FullPath;
                        CreateNode(this.treeView.Nodes, path.Substring(0, path.LastIndexOf(treeView.PathSeparator)), e.Name, fileInfo);
                        path = path.Replace(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "My Documents");
                        CreateNode(this.treeView.Nodes, path.Substring(0, path.LastIndexOf(treeView.PathSeparator)), e.Name, fileInfo);
                    }
                }
         
                private void CreateNode(TreeNodeCollection nodeCollection, String fullPath, String name, FileInfo fileInfo)//создание TreeNode
                {
                    String path;
                    foreach (TreeNode subNode in nodeCollection)
                    {
                        path = ((DirectoryInfo)this.treeView.SelectedNode.Tag).FullName;
                        if (path == fullPath)
                        {
                            TreeNode RootNode = new TreeNode(name.Substring(name.LastIndexOf(treeView.PathSeparator) + 1));
                            switch (fileInfo.Attributes)
                            {
                                case FileAttributes.Hidden:
                                    RootNode.ImageIndex = 2;
                                    RootNode.SelectedImageIndex = 3;
                                    break;
                                default:
                                    RootNode.ImageIndex = 0;
                                    RootNode.SelectedImageIndex = 1;
                                    break;
                            }
                            RootNode.Tag = fileInfo;
                            RootNode.ContextMenuStrip = this.contextMenuStrip;
                            subNode.Nodes.Add(RootNode);
                        }
                        if (subNode.Nodes.Count != 0)
                        {
                            CreateNode(subNode.Nodes, fullPath, name, fileInfo);
                        }
                    }
                }
                
                private void OnDeleted(object sender, FileSystemEventArgs e)//удаление папки
                {
                    FileInfo fileInfo = new FileInfo(e.FullPath);
                    if (fileInfo.Attributes == FileAttributes.Directory)
                    {
                        String path = e.FullPath;
                        DeleteNode(this.treeView.Nodes, path);
                        path = path.Replace(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "My Documents");
                        DeleteNode(this.treeView.Nodes, path);
                    }
                }
         
                private void DeleteNode(TreeNodeCollection nodeCollection, String fullPath)//удаление TreeNode
                {
                    String path;
                    foreach (TreeNode subNode in nodeCollection)
                    {
                        path = ((DirectoryInfo)this.treeView.SelectedNode.Tag).FullName;
                        if (path == fullPath)
                        {
                            subNode.Remove();
                        }
                        if (subNode.Nodes.Count != 0)
                        {
                            DeleteNode(subNode.Nodes, fullPath);
                        }
                    }
                }

      3. Функции создания папки
      ExpandedWrap disabled
        private void NewFolder(object sender, EventArgs e)
                {
                    if (this.treeView.SelectedNode != null)
                    {
                        if (this.treeView.SelectedNode.Level != 0 && this.treeView.SelectedNode.Name != "My Computer")
                        {
                            String path = ((DirectoryInfo)this.treeView.SelectedNode.Tag).FullName;
                            try
                            {
                                if (Directory.Exists(path))
                                {
                                    return;
                                }
                                DirectoryInfo dirInfo = Directory.CreateDirectory(path);
                                dirInfo.Create();
                                TreeNode RootNode = new TreeNode(dirInfo.Name);
                                RootNode.Tag = dirInfo;
                                RootNode.BeginEdit();
                                this.treeView.SelectedNode.Nodes.Add(RootNode);
                            }
                            finally { }
                        }
                    }
                }
      и удаления ее.
      ExpandedWrap disabled
         private void DeleteFolder(object sender, EventArgs e)
                {
                    if (this.treeView.SelectedNode != null)
                    {
                        if (this.treeView.SelectedNode.Level != 0 && this.treeView.SelectedNode.Name != "My Computer" && this.treeView.SelectedNode.Parent.Name != "My Computer")
                        {
                            String path = ((DirectoryInfo)this.treeView.SelectedNode.Tag).FullName;
                            try
                            {
                                if (MessageBox.Show("Delete this directory?", "Explorer", MessageBoxButtons.YesNo) == DialogResult.Yes)
                                {
                                    DirectoryInfo dirInfo = new DirectoryInfo(path);
                                    dirInfo.Delete(true);
                                    this.treeView.SelectedNode.Remove();
                                }
                            }
                            finally { }
                        }
                    }
                }

      4. При выделении TreeNode заполняем TextBox'ы информацией:
      ExpandedWrap disabled
        private void BeforeSelect(object sender, TreeViewCancelEventArgs e)
                {
                    if (e.Node.Tag != null)
                    {
                        this.textBoxFileName.Text = ((DirectoryInfo)e.Node.Tag).Name;
                        this.textBoxCreationTime.Text = ((DirectoryInfo)e.Node.Tag).CreationTime.ToString();
                    }
                }

      Это почти вся правда о работе с файловой системой. :)
      Прикреплённый файлПрикреплённый файлExplorer.zip (88.75 Кбайт, скачиваний: 439)
        Цитата PIL @
        StreamReader sr = file.OpenText();

        Это если файл в кодировке UTF-8, а если в какой-нибудь другой, то это не прокатит. Лучше использовать конструктор StreamReader'а и указывать кодировку явно. Например для юникода так:
        ExpandedWrap disabled
          StreamReader sr = new StreamReader(file.FullName, Encoding.Unicode);
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0740 ]   [ 16 queries used ]   [ Generated: 25.04.24, 01:29 GMT ]