using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.IO.Compression;
using System.Security.AccessControl;
using System.Security.Principal;
namespace lab21
{
public partial class Form1 : Form
{
bool FlagFindDirectory = false;
BackgroundWorker dataLoadBackgroundWorker = new BackgroundWorker();
TreeNode rootNode;
List<FileInfo> FI = new List<FileInfo>();
public Form1()
{
InitializeComponent();
dataLoadBackgroundWorker.WorkerSupportsCancellation = true;
dataLoadBackgroundWorker.DoWork += new DoWorkEventHandler(dataLoadBackgroundWorker_DoWork);
}
private void buttonFind_Click(object sender, EventArgs e)
{
FI.Clear();
treeView1.Nodes.Clear();
if (rootNode != null) rootNode.Nodes.Clear();
ContestOfFileBox.Text = "";
dataLoadBackgroundWorker.RunWorkerAsync(sender);
}
private void StopFindButton_Click(object sender, EventArgs e)
{
dataLoadBackgroundWorker.CancelAsync();
}
void dataLoadBackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
((Control)e.Argument).Invoke(new ButtonAndBarAndTimerDelegate(ButtonAndBarAndTimerEnabledOnOff), e.Argument, progressBar1, timer1);
DriveInfo[] allDrives = DriveInfo.GetDrives();
foreach (DriveInfo DI_element in allDrives)
{
rootNode = new TreeNode(DI_element.Name);
DirectoryInfo Dir = new DirectoryInfo(DI_element.Name); //"D:\\");
WalkDirectoryTree(Dir, e, rootNode);
if (FlagFindDirectory) ((Control)treeView1).Invoke(new treeViewDelegateD(treeViewUpdateD), treeView1, rootNode);
}
((Control)e.Argument).Invoke(new ButtonAndBarAndTimerDelegate(ButtonAndBarAndTimerEnabledOnOff), e.Argument, progressBar1, timer1);
}
private void WalkDirectoryTree(DirectoryInfo root, DoWorkEventArgs e, TreeNode nodeToAddTo)
{
FileInfo[] files = null;
DirectoryInfo[] subDirs = null;
TreeNode aNode;
if (dataLoadBackgroundWorker.CancellationPending)
{
e.Cancel = true;
}
else
{
if (!FlagFindDirectory)
{
try
{
files = root.GetFiles("*.*");
}
catch (IOException) { MessageBox.Show("Устройство " + root.FullName + " не готов"); }
catch (UnauthorizedAccessException) { }
if (files != null)
{
foreach (FileInfo element in files)
if (Path.GetFileNameWithoutExtension(element.Name) == textBoxOfPath.Text)
FI.Add(element);//((Control)treeView1).Invoke(new treeViewDelegateF(treeViewUpdateF), treeView1, element);
subDirs = root.GetDirectories();
foreach (DirectoryInfo dirInfo in subDirs)
{
aNode = new TreeNode(dirInfo.Name, 0, 0);
WalkDirectoryTree(dirInfo, e, aNode);
}
}
}
else
{
try
{
subDirs = root.GetDirectories();
WindowsIdentity WI = WindowsIdentity.GetCurrent();
DirectorySecurity DSecurity = root.GetAccessControl(AccessControlSections.Access);
AuthorizationRuleCollection Rules = DSecurity.GetAccessRules(true, true, typeof(SecurityIdentifier));
foreach (FileSystemAccessRule Rule in Rules)
{
SecurityIdentifier sid = (SecurityIdentifier)Rule.IdentityReference;
if (((Rule.FileSystemRights & FileSystemRights.WriteData) == FileSystemRights.WriteData))
{
if ((sid.IsAccountSid() && WI.User == sid) || (!sid.IsAccountSid() && WI.Groups.Contains(sid)))
{
if (Rule.AccessControlType == AccessControlType.Allow)
{
aNode = new TreeNode(root.Name, 0, 0);
if (nodeToAddTo.Name != aNode.Name) nodeToAddTo.Nodes.Add(aNode);
}
}
}
}
foreach (DirectoryInfo dirInfo in subDirs)
{
aNode = new TreeNode(dirInfo.Name, 0, 0);
WalkDirectoryTree(dirInfo, e, aNode);
nodeToAddTo.Nodes.Add(aNode);
}
}
catch (UnauthorizedAccessException) { }
catch (IOException) { MessageBox.Show("Устройство " + root.FullName + " не готов"); }
}
}
}
private delegate void ButtonAndBarAndTimerDelegate(Button button, ProgressBar bar, Timer timer);
private void ButtonAndBarAndTimerEnabledOnOff(Button button, ProgressBar bar, Timer timer)
{
if (!FlagFindDirectory) timer.Enabled = !timer.Enabled;
bar.Visible = !bar.Visible;
button.Enabled = !button.Enabled;
}
private delegate void treeViewDelegateF(TreeView tree, FileInfo element);
private void treeViewUpdateF(TreeView tree, FileInfo element)
{
tree.Nodes.Add(element.FullName);
}
private delegate void treeViewDelegateD(TreeView tree, TreeNode element);
private void treeViewUpdateD(TreeView tree, TreeNode element)
{
tree.Nodes.Add(element);
}
private void AlreadySelect(object sender, TreeViewEventArgs e)
{
string Extension = Path.GetExtension(treeView1.SelectedNode.FullPath);
string[] TextExtension = { ".txt", ".rst", ".html", ".htm", ".css" };
string[] ImageExtension = { ".jpg", ".png", ".bmp", ".jpeg", ".tif" };
for (int i = 0; i != 5; ++i)
{
if (Extension == TextExtension[i])
{
FileStream FStream = new FileStream(treeView1.SelectedNode.FullPath, FileMode.Open, FileAccess.Read);
StreamReader StreamR = new StreamReader(FStream);
ContestOfFileBox.Text = StreamR.ReadToEnd();
StreamR.Close();
FStream.Close();
}
if (Extension == ImageExtension[i])
{
ContestOfFileBox.Text = "";
Bitmap myBitmap = new Bitmap(treeView1.SelectedNode.FullPath);
Clipboard.SetDataObject(myBitmap);
DataFormats.Format format = DataFormats.GetFormat(DataFormats.Bitmap);
ContestOfFileBox.Paste(format);
Clipboard.Clear();
}
}
}
private void CompressFileButton_Click(object sender, EventArgs e)
{
try
{
if (!FlagFindDirectory)
{
FileInfo fileToCompress = new FileInfo(treeView1.SelectedNode.FullPath);
Compress(fileToCompress);
}
else MessageBox.Show("Вы не можете сжать каталог");
}
catch (NullReferenceException){MessageBox.Show("Не выбран файл, который надо сжать!");}
}
private static void Compress(FileInfo fileToCompress)
{
try
{
using (FileStream originalFileStream = fileToCompress.OpenRead())
{
if ((File.GetAttributes(fileToCompress.FullName) & FileAttributes.Hidden) != FileAttributes.Hidden & fileToCompress.Extension != ".gz")
{
using (FileStream compressedFileStream = File.Create(fileToCompress.FullName + ".gz"))
{
using (GZipStream compressionStream = new GZipStream(compressedFileStream, CompressionLevel.Optimal))
{
originalFileStream.CopyTo(compressionStream);
MessageBox.Show("Сжат файл " + fileToCompress.Name + " с " + fileToCompress.Length.ToString()
+ " до " + compressedFileStream.Length.ToString() + " байт. Архив сохранен в той же директории.");
}
}
}
}
}
catch (UnauthorizedAccessException) { MessageBox.Show("У вас недостаточно прав для сохранения архива в данной директории"); }
}
private void оПрограммеToolStripMenuItem_Click(object sender, EventArgs e)
{
MessageBox.Show("Напишите приложение для поиска всех файлов с заданным именем на компьютере." +
"Приложение должно в элементе TreeView показать путь к найденным файлам." +
"Реализовать возможность просмотра найденных файлов в текстовом окне и сжатия с использованием объекта класса GZipStream." +
"Добавьте в меню опцию поиска всех папок, к которым есть доступ у заданной группы (в качестве примера рассмотреть группу Everyone)." +
"Результат поиска представить в элементе TreeView." +
Environment.NewLine + "Группа: 5-ПМИ-095" + Environment.NewLine + "Сделал: Дубровский Николай");
}
private void поискПапокToolStripMenuItem_Click(object sender, EventArgs e)
{
FlagFindDirectory = !FlagFindDirectory;
if (FlagFindDirectory) MessageBox.Show("Поиск папок с доступом everyone активирован");
else MessageBox.Show("Поиск папок с доступом everyone деактивирован");
}
private void TickIsOver(object sender, EventArgs e)
{
foreach (FileInfo element in FI)
treeView1.Nodes.Add(element.FullName);
FI.Clear();
}
}
}