Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.22.61.246] |
|
Сообщ.
#1
,
|
|
|
Простой пример работы с файловой системой. В частности - подсчет количества строк в файлах с определенным расширением в определенной папке и ее подпапках:
1. Рекурсивный обход подпапок в пути, определение файлов по расширению: 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. Подсчет кол-ва строк в файле: private int CalcOneFile(FileInfo file){ int count = 0; StreamReader sr = file.OpenText(); while(sr.ReadLine() != null){ count ++; } sr.Close(); return count; } 3. И сам пример самого вызова сканирования: FolderBrowserDialog dlg = new FolderBrowserDialog(); if(dlg.ShowDialog(this) == DialogResult.OK){ ScanDirectory(dlg.SelectedPath); } PS: using System.Windows.Forms; using System.IO; Это сообщение было перенесено сюда или объединено из темы "Работа с файловой системой" |
Сообщ.
#2
,
|
|
|
Часто возникает задача - работа с файловой системой. Вот решение этой задачи:
1. Подключаем System.IO. Создаем на форме TreeView, WebBrowser(можно использовать ListView или ListBox, их надо будет заполнять аналогично TreeView), ContextMenuStrip с двумя кнопками(удалить создать папку), 2 TextBox'а и ImageList. В ImageList добавить картинки папок(открытая/закрытая, 2 скрытых папки(открытая/закрытая)), компьютера, CDRom'а и жесткого диска. 2. При загрузке формы заполняем TreeView: 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: 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. Функции создания папки 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 { } } } } 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'ы информацией: 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) |
Сообщ.
#3
,
|
|
|
Цитата PIL @ StreamReader sr = file.OpenText(); Это если файл в кодировке UTF-8, а если в какой-нибудь другой, то это не прокатит. Лучше использовать конструктор StreamReader'а и указывать кодировку явно. Например для юникода так: StreamReader sr = new StreamReader(file.FullName, Encoding.Unicode); |