private void LoadStorageInfo()
        {
            System.IO.DriveInfo drvinfo = new System.IO.DriveInfo(driveletter.ToString());
            picimage.BackgroundImage = FilesystemIcons.GetLargeIcon(drvinfo.Name.Substring(0, 2) + @"\").ToBitmap();

            //Daten eintragen
            lbdrivename.Text = DriveFunctions.GetVolumeLabel(driveletter) + " (" + driveletter.ToString().ToUpper() + ":)";
            lbmodel.Text     = DriveFunctions.GetDriveModelName(DriveFunctions.GetPartitionData(driveletter.ToString())[0]);
            lbdiskindex.Text = "Disk-Index: " + DriveFunctions.GetPartitionData(driveletter.ToString())[0];
            lbpartindex.Text = "Partition-Index: " + DriveFunctions.GetPartitionData(driveletter.ToString())[1];
        }
        private void storageinfotimer_Tick(object sender, EventArgs e)
        {
            //Die Zahlen zur aktuellen Partition erhalten
            ulong[] values = DriveFunctions.GetPartitionSizeData(driveletter);

            //Die Zahlen in die Felder eintragen
            lbsizefilledbyte.Text = ExtraFunctions.GetNumberWithPoints(Convert.ToDouble(values[2]));
            lbsizefreebyte.Text   = ExtraFunctions.GetNumberWithPoints(Convert.ToDouble(values[1]));
            lbsizegesbyte.Text    = ExtraFunctions.GetNumberWithPoints(Convert.ToDouble(values[0]));

            lbsizefilled.Text = ExtraFunctions.UnitChange(Convert.ToDouble(values[2]));
            lbsizefree.Text   = ExtraFunctions.UnitChange(Convert.ToDouble(values[1]));
            lbsizeges.Text    = ExtraFunctions.UnitChange(Convert.ToDouble(values[0]));

            //Jetzt muss der Balken gezeichnet werden. Die Farbe ist AquaMarine
            Graphics g = picstoragebar.CreateGraphics();

            g.Clear(Color.LightGray);
            Color fillcolor = Color.Aqua;
            Brush brush     = new SolidBrush(fillcolor);

            //Die Werte müssen gezeichnet werden. Da die Größe des Balkens sich verändern kann, muss es
            //dynamisch berechnet werden können
            double percentfilled = values[2] * 100 / values[0];
            double lenbar        = picstoragebar.Size.Width / 100 * percentfilled;

            //Die Bar wird jetzt gezeichnet
            g.FillRectangle(brush, 0, 0, Convert.ToSingle(lenbar), picstoragebar.Size.Height);

            //Die Objekte disposen (da die viel RAM verbrauchen)
            g.Dispose();
            brush.Dispose();

            //Das Textlabel mit den Speicher auch aktualisieren
            lbstorageinfo.Text = ExtraFunctions.UnitChange(Convert.ToDouble(values[1])) + " frei von " + ExtraFunctions.UnitChange(Convert.ToDouble(values[0]));
        }
        private void ShowPathContent()
        {
            //ListView leeren
            lvfs.Items.Clear();

            //Wenn der Pfad leer ist, sollen die Drives angezeigt werden. Wenn aber ein Pfad enthalten ist
            //soll der Inhalt des Pfades (Ordner) angezeigt werden
            if (_aktpfad == "")
            {
                smlist.Images.Clear();

                //Nun werden alle Drives geladen und angezeigt
                foreach (DriveInfo drive in DriveInfo.GetDrives())
                {
                    //Icon ermitteln
                    smlist.Images.Add(FilesystemIcons.GetSmallIcon(string.Concat(drive.Name.Substring(0, 2) + @"\")));
                    //Jetzt muss geschaut werden, ob der Drive aktiv ist oder nicht und danach entschieden werden
                    if (drive.IsReady)
                    {
                        ListViewItem lvi = new ListViewItem(string.Concat(drive.Name.Substring(0, 2), " ", DriveFunctions.GetVolumeLabel(Convert.ToChar(drive.Name.Substring(0, 1)))), smlist.Images.Count - 1);
                        lvi.SubItems.Add(""); //Dummy
                        //Der Typ wird anhand des DriveType angegeben. Bei Size kommt der maximale Speicherplatz
                        if (drive.DriveType == DriveType.Fixed)
                        {
                            lvi.SubItems.Add(DriveFunctions.DRIVE_VOLUMELABEL_STD_HDD);
                        }
                        else if (drive.DriveType == DriveType.CDRom)
                        {
                            lvi.SubItems.Add(DriveFunctions.DRIVE_VOLUMELABEL_STD_OPT);
                        }
                        else if (drive.DriveType == DriveType.Removable)
                        {
                            lvi.SubItems.Add(DriveFunctions.DRIVE_VOLUMELABEL_STD_EXT);
                        }
                        else if (drive.DriveType == DriveType.Network)
                        {
                            lvi.SubItems.Add(DriveFunctions.DRIVE_VOLUMELABEL_STD_NET);
                        }
                        else
                        {
                            lvi.SubItems.Add("Unbekannter Laufwerkstyp");
                        }

                        lvi.SubItems.Add(ExtraFunctions.UnitChange(drive.TotalSize));
                        lvfs.Items.Add(lvi);
                    }
                    else
                    {
                        ListViewItem lvi = new ListViewItem(string.Concat(drive.Name.Substring(0, 2), @"\"), smlist.Images.Count - 1);
                        lvi.SubItems.Add(""); //Dummy
                        //Der Typ wird anhand des DriveType angegeben. Bei Size kommt der maximale Speicherplatz
                        if (drive.DriveType == DriveType.Fixed)
                        {
                            lvi.SubItems.Add(DriveFunctions.DRIVE_VOLUMELABEL_STD_HDD);
                        }
                        else if (drive.DriveType == DriveType.CDRom)
                        {
                            lvi.SubItems.Add(DriveFunctions.DRIVE_VOLUMELABEL_STD_OPT);
                        }
                        else if (drive.DriveType == DriveType.Removable)
                        {
                            lvi.SubItems.Add(DriveFunctions.DRIVE_VOLUMELABEL_STD_EXT);
                        }
                        else if (drive.DriveType == DriveType.Network)
                        {
                            lvi.SubItems.Add(DriveFunctions.DRIVE_VOLUMELABEL_STD_NET);
                        }
                        else
                        {
                            lvi.SubItems.Add("Unbekannter Laufwerkstyp");
                        }
                        lvfs.Items.Add(lvi);
                    }
                }
            }
            else
            {
                DirectoryInfo dirinfo = new DirectoryInfo(_aktpfad);
                smlist.Images.Clear();
                smlist.Images.Add(FilesystemIcons.ICON_FILE_16x);

                //Zuerst kommen die Directories
                foreach (DirectoryInfo d in dirinfo.GetDirectories())
                {
                    try
                    {
                        smlist.Images.Add(FilesystemIcons.GetSmallIcon(d.FullName));
                    }
                    catch                                                      //Wenn das Icon über GetSmallIcon nicht genommen wird
                    {
                        smlist.Images.Add(FilesystemIcons.ICON_DIRECTORY_16x); //Ersatzicon
                    }
                    ListViewItem lvi = new ListViewItem(d.Name, smlist.Images.Count - 1);
                    lvi.SubItems.Add(d.LastWriteTime.ToString());
                    lvi.SubItems.Add(Extra.StringResource.GetStringResourceFromFile("@shell32.dll,-10152").ToString());
                    lvfs.Items.Add(lvi);
                }

                //Jetzt kommen die Files. Hier kann man denselben Code wie in ExplorerPlusFileView verwenden
                //Nun wird die Liste gefüllt
                foreach (FileInfo file in dirinfo.GetFiles())
                {
                    //Anhand der Erweiterung schauen, ob es eine Verknüpfung ist oder nicht
                    try
                    {
                        try
                        {
                            if (file.Extension == ".lnk")
                            {
                                smlist.Images.Add(FilesystemIcons.GetSmallIcon(FileFunctions.GetShortcutPath(file.FullName)));
                            }
                            else
                            {
                                smlist.Images.Add(FilesystemIcons.GetSmallIcon(file.FullName));
                            }
                        }
                        catch
                        {
                            smlist.Images.Add(FilesystemIcons.GetIconByExtension_x16(file.Extension));
                        }
                        ListViewItem lvi = new ListViewItem(file.Name, smlist.Images.Count - 1);
                        lvi.SubItems.Add(file.LastWriteTime.ToString());
                        lvi.SubItems.Add(FileFunctions.GetFileTypeDescription(file.Extension));

                        //Wenn die dateigröße unter 1024 Bytes ist, soll stattdessen 1 KB ausgegeben werden
                        if (file.Length < 1024)
                        {
                            lvi.SubItems.Add("1 KB");
                        }
                        else
                        {
                            lvi.SubItems.Add(ExtraFunctions.GetFileSizeKB(Convert.ToDouble(file.Length)));
                        }
                        lvfs.Items.Add(lvi);
                    }
                    catch (UnauthorizedAccessException)
                    { //Geht nicht, da kein Zugriff
                    }
                    catch
                    {
                        ListViewItem lvi = new ListViewItem(file.Name, 0);
                        lvi.SubItems.Add(file.LastWriteTime.ToString());
                        lvi.SubItems.Add(FileFunctions.GetFileTypeDescription(file.Extension));

                        //Wenn die dateigröße unter 1024 Bytes ist, soll stattdessen 1 KB ausgegeben werden
                        if (file.Length < 1024)
                        {
                            lvi.SubItems.Add("1 KB");
                        }
                        else
                        {
                            lvi.SubItems.Add(ExtraFunctions.GetFileSizeKB(Convert.ToDouble(file.Length)));
                        }
                        lvfs.Items.Add(lvi);
                    }
                }
            }
            cbrecentpaths.Text = _aktpfad;
        }
        public void LoadDrives()
        {
            //Erstmal müssen alle Nodes aus der TreeView entfernt werden, bevor die Drives angezeigt werden können
            tvfilesystem.Nodes.Clear();
            tvfilesystem.ImageList.Images.Clear();

            //Die Standardicons aus der Klasse 'FilesystemIcons' einfügen, damit diese nicht ständig nachgeladen werden müssen
            imglist.Images.Add(FilesystemIcons.ICON_DIRECTORY_16x); //Index 0

            //Nun werden alle Drives geladen und angezeigt
            foreach (DriveInfo drive in DriveInfo.GetDrives())
            {
                //Jetzt muss geschaut werden, ob der Drive aktiv ist oder nicht und danach entschieden werden
                if (drive.IsReady)
                {
                    //Icon ermitteln
                    imglist.Images.Add(FilesystemIcons.GetSmallIcon(string.Concat(drive.Name.Substring(0, 2) + DS)));

                    //TreeNode erstellen und hinzufügen
                    TreeNode n = new TreeNode(string.Concat(drive.Name.Substring(0, 2), " ", DriveFunctions.GetVolumeLabel(Convert.ToChar(drive.Name.Substring(0, 1)))));
                    n.ImageIndex         = tvfilesystem.ImageList.Images.Count - 1;
                    n.SelectedImageIndex = tvfilesystem.ImageList.Images.Count - 1;
                    tvfilesystem.Nodes.Add(n);

                    //Prüfen, ob das Drive über Ordner verfügt
                    if (DirectoryFunctions.HasSubDirectories(drive.Name.Substring(0, 2) + DS))
                    {
                        //Wenn es über Ordner verfügt, soll der tenporäre TreeNode geadded werden
                        //Das ist dann für das generieren der Subnodes notwendig
                        tvfilesystem.Nodes[tvfilesystem.Nodes.Count - 1].Nodes.Add(TREENODE_DIRSUB);
                    }
                }
                else
                {
                    //TreeNode erstellen und hinzufügen
                    imglist.Images.Add(FilesystemIcons.GetSmallIcon(string.Concat(drive.Name.Substring(0, 2) + DS)));
                    TreeNode n = new TreeNode(string.Concat(drive.Name.Substring(0, 2), DS));
                    n.ImageIndex         = tvfilesystem.ImageList.Images.Count - 1;
                    n.SelectedImageIndex = tvfilesystem.ImageList.Images.Count - 1;
                    tvfilesystem.Nodes.Add(n);
                }
            }
        }
        /// <summary>
        /// Prüft, ob die Drives noch vorhanden sind. Wenn nicht, sollen diese vernichtet werden
        /// </summary>
        private void Thread_CheckDrives()
        {
            //Liste mit allen Drives laden
            string[] driveold = new string[tvfilesystem.Nodes.Count];
            for (int i = 0; i < tvfilesystem.Nodes.Count; i++)
            {
                driveold[i] = tvfilesystem.Nodes[i].Text;
            }

            //Alle Drives jetzt prüfen
            bool isfound = false;

            foreach (DriveInfo drvinfo in DriveInfo.GetDrives())
            {
                isfound = false;
                //jetzt wird überprüft, ob der Eintrag gefunden wurde
                for (int i = 0; i < driveold.Length; i++)
                {
                    //Wenn das Laufwerk gefunden wurde
                    if (driveold[i] != "")
                    {
                        if (driveold[i].Substring(0, 1) == drvinfo.Name.Substring(0, 1))
                        {
                            driveold[i] = "";
                            isfound     = true;
                            break; //For-Schleife kann verlassen werden
                        }
                    }
                }

                if (isfound == false) //wenn das Laufwerk nicht gefunden wurde, dann soll es hinzugefügt werden
                {
                    //Jetzt muss geschaut werden, ob der Drive aktiv ist oder nicht und danach entschieden werden
                    if (drvinfo.IsReady)
                    {
                        //Icon ermitteln
                        imglist.Images.Add(FilesystemIcons.GetSmallIcon(string.Concat(drvinfo.Name.Substring(0, 2) + DS)));

                        //TreeNode erstellen und hinzufügen
                        TreeNode n = new TreeNode(string.Concat(drvinfo.Name.Substring(0, 2), " ", DriveFunctions.GetVolumeLabel(Convert.ToChar(drvinfo.Name.Substring(0, 1)))));
                        n.ImageIndex         = tvfilesystem.ImageList.Images.Count - 1;
                        n.SelectedImageIndex = tvfilesystem.ImageList.Images.Count - 1;
                        tvfilesystem.Nodes.Add(n);

                        //Prüfen, ob das Drive über Ordner verfügt
                        if (DirectoryFunctions.HasSubDirectories(drvinfo.Name.Substring(0, 2) + DS))
                        {
                            //Wenn es über Ordner verfügt, soll der tenporäre TreeNode geadded werden
                            //Das ist dann für das generieren der Subnodes notwendig
                            tvfilesystem.Nodes[tvfilesystem.Nodes.Count - 1].Nodes.Add(TREENODE_DIRSUB);
                        }
                    }
                    else
                    {
                        //TreeNode erstellen und hinzufügen
                        imglist.Images.Add(FilesystemIcons.GetSmallIcon(string.Concat(drvinfo.Name.Substring(0, 2) + DS)));
                        TreeNode n = new TreeNode(string.Concat(drvinfo.Name.Substring(0, 2), DS));
                        n.ImageIndex         = tvfilesystem.ImageList.Images.Count - 1;
                        n.SelectedImageIndex = tvfilesystem.ImageList.Images.Count - 1;
                        tvfilesystem.Nodes.Add(n);
                    }
                }
            }

            //Prüfen, ob noch Einträge in dem Array nicht geleert wurden. Wenn welche gefunden wurden, müssen diese vernichtet werden
            for (int i = driveold.Length; i > 0; i--)
            {
                if (driveold[i - 1] != "") //Wenn das laufwerk in der Liste noch da ist, aber nicht mehr da ist, wird es gelöscht
                {
                    tvfilesystem.Nodes.RemoveAt(i - 1);
                }
            }
        }
        private void ShowPathContent()
        {
            //ListView leeren
            lvfiles.Items.Clear();

            //ImageListen vorbereiten. Es werden jeweils 2 erstellt, einmal für die SmallIcons und
            //einmal für die LargeIcons
            ImageList sil = new ImageList();
            ImageList lil = new ImageList();

            sil.ColorDepth = ColorDepth.Depth32Bit;
            sil.ImageSize  = new Size(16, 16);
            lil.ColorDepth = ColorDepth.Depth32Bit;
            lil.ImageSize  = new Size(48, 48);
            sil.Images.Add(FilesystemIcons.ICON_FILE_16x);
            lil.Images.Add(FilesystemIcons.ICON_FILE_32x);
            lvfiles.SmallImageList = sil;
            lvfiles.LargeImageList = lil;

            //Wenn der Pfad leer ist, sollen die Drives angezeigt werden. Wenn aber ein Pfad enthalten ist
            //soll der Inhalt des Pfades (Ordner) angezeigt werden
            if (_selectedpath == "")
            {
                //View hier

                //Nun werden alle Drives geladen und angezeigt
                foreach (DriveInfo drive in DriveInfo.GetDrives())
                {
                    //Icon ermitteln
                    sil.Images.Add(FilesystemIcons.GetSmallIcon(string.Concat(drive.Name.Substring(0, 2) + @"\")));
                    lil.Images.Add(FilesystemIcons.GetLargeIcon(string.Concat(drive.Name.Substring(0, 2) + @"\")));
                    //Jetzt muss geschaut werden, ob der Drive aktiv ist oder nicht und danach entschieden werden
                    if (drive.IsReady)
                    {
                        ListViewItem lvi = new ListViewItem(string.Concat(drive.Name.Substring(0, 2), " ", DriveFunctions.GetVolumeLabel(Convert.ToChar(drive.Name.Substring(0, 1)))), sil.Images.Count - 1);
                        lvi.SubItems.Add(""); //Dummy
                        //Der Typ wird anhand des DriveType angegeben. Bei Size kommt der maximale Speicherplatz
                        if (drive.DriveType == DriveType.Fixed)
                        {
                            //Wenn es eine SSD ist, soll das auch so angegeben werden
                            if (DriveFunctions.IsSSD(Convert.ToChar(drive.Name.Substring(0, 1))))
                            {
                                lvi.SubItems.Add(DriveFunctions.DRIVE_VOLUMELABEL_STD_SSD_DESC);
                            }
                            else
                            {
                                lvi.SubItems.Add(DriveFunctions.DRIVE_VOLUMELABEL_STD_HDD_DESC);
                            }
                        }
                        else if (drive.DriveType == DriveType.CDRom)
                        {
                            lvi.SubItems.Add(DriveFunctions.DRIVE_VOLUMELABEL_STD_OPT);
                        }
                        else if (drive.DriveType == DriveType.Removable)
                        {
                            lvi.SubItems.Add(DriveFunctions.DRIVE_VOLUMELABEL_STD_EXT);
                        }
                        else if (drive.DriveType == DriveType.Network)
                        {
                            lvi.SubItems.Add(DriveFunctions.DRIVE_VOLUMELABEL_STD_NET);
                        }
                        else
                        {
                            lvi.SubItems.Add("Unbekannter Laufwerkstyp");
                        }

                        lvi.SubItems.Add(ExtraFunctions.UnitChange(drive.TotalSize));


                        lvi.SubItems.Add(getView(drive.Name).ToString());
                        lvfiles.Items.Add(lvi);
                    }
                    else
                    {
                        ListViewItem lvi = new ListViewItem(string.Concat(drive.Name.Substring(0, 2), @"\"), sil.Images.Count - 1);
                        lvi.SubItems.Add(""); //Dummy
                        //Der Typ wird anhand des DriveType angegeben. Bei Size kommt der maximale Speicherplatz
                        if (drive.DriveType == DriveType.Fixed)
                        {
                            lvi.SubItems.Add(DriveFunctions.DRIVE_VOLUMELABEL_STD_HDD);
                        }
                        else if (drive.DriveType == DriveType.CDRom)
                        {
                            lvi.SubItems.Add(DriveFunctions.DRIVE_VOLUMELABEL_STD_OPT);
                        }
                        else if (drive.DriveType == DriveType.Removable)
                        {
                            lvi.SubItems.Add(DriveFunctions.DRIVE_VOLUMELABEL_STD_EXT);
                        }
                        else if (drive.DriveType == DriveType.Network)
                        {
                            lvi.SubItems.Add(DriveFunctions.DRIVE_VOLUMELABEL_STD_NET);
                        }
                        else
                        {
                            lvi.SubItems.Add("Unbekannter Laufwerkstyp");
                        }
                        lvi.SubItems.Add(getView(drive.Name).ToString());
                        lvfiles.Items.Add(lvi);
                    }
                }
            }
            else
            {
                //hier implemintiere mich meine code


                DirectoryInfo dirinfo = new DirectoryInfo(_selectedpath);

                if (_selectedpath == @"C:\" || _selectedpath == @"D:\")
                {
                    setView(_selectedpath);
                }
                else if (_selectedpath.EndsWith(@"\"))
                {
                    setView(_selectedpath.Substring(0, _selectedpath.Length - 1));
                }
                else
                {
                    setView(_selectedpath);
                }
                //Zuerst kommen die Directories
                foreach (DirectoryInfo d in dirinfo.GetDirectories())
                {
                    try
                    {
                        sil.Images.Add(FilesystemIcons.GetSmallIcon(d.FullName));
                        lil.Images.Add(FilesystemIcons.GetLargeIcon(d.FullName));
                    }
                    catch                                                   //Wenn das Icon über GetSmallIcon nicht genommen wird
                    {
                        sil.Images.Add(FilesystemIcons.ICON_DIRECTORY_16x); //Ersatzicon
                        lil.Images.Add(FilesystemIcons.ICON_DIRECTORY_32x); //Ersatzicon
                    }
                    ListViewItem lvi = new ListViewItem(d.Name, sil.Images.Count - 1);
                    lvi.SubItems.Add(d.LastWriteTime.ToString());
                    lvi.SubItems.Add(Extra.StringResource.GetStringResourceFromFile("@shell32.dll,-10152").ToString());
                    lvi.SubItems.Add("");
                    lvi.SubItems.Add(getView(d.FullName).ToString());
                    lvfiles.Items.Add(lvi);
                }

                //Jetzt kommen die Files. Hier kann man denselben Code wie in ExplorerPlusFileView verwenden
                //Nun wird die Liste gefüllt
                foreach (FileInfo file in dirinfo.GetFiles())
                {
                    //Anhand der Erweiterung schauen, ob es eine Verknüpfung ist oder nicht
                    try
                    {
                        try
                        {
                            if (file.Extension == ".lnk")
                            {
                                sil.Images.Add(FilesystemIcons.GetSmallIcon(FileFunctions.GetShortcutPath(file.FullName)));
                                lil.Images.Add(FilesystemIcons.GetLargeIcon(FileFunctions.GetShortcutPath(file.FullName)));
                            }
                            else
                            {
                                sil.Images.Add(FilesystemIcons.GetSmallIcon(file.FullName));
                                lil.Images.Add(FilesystemIcons.GetLargeIcon(file.FullName));
                            }
                        }
                        catch
                        {
                            sil.Images.Add(FilesystemIcons.GetIconByExtension_x16(file.Extension));
                            lil.Images.Add(FilesystemIcons.GetIconByExtension_x32(file.Extension));
                        }
                        ListViewItem lvi = new ListViewItem(file.Name, sil.Images.Count - 1);
                        lvi.SubItems.Add(file.LastWriteTime.ToString());
                        lvi.SubItems.Add(FileFunctions.GetFileTypeDescription(file.Extension));

                        //Wenn die dateigröße unter 1024 Bytes ist, soll stattdessen 1 KB ausgegeben werden
                        if (file.Length < 1024)
                        {
                            lvi.SubItems.Add("1 KB");
                        }
                        else
                        {
                            lvi.SubItems.Add(ExtraFunctions.GetFileSizeKB(Convert.ToDouble(file.Length)));
                        }

                        lvi.SubItems.Add(getView(file.FullName).ToString());
                        lvfiles.Items.Add(lvi);
                    }
                    catch (UnauthorizedAccessException)
                    { //Geht nicht, da kein Zugriff
                    }
                    catch
                    {
                        ListViewItem lvi = new ListViewItem(file.Name, 0);
                        lvi.SubItems.Add(file.LastWriteTime.ToString());
                        lvi.SubItems.Add(FileFunctions.GetFileTypeDescription(file.Extension));

                        //Wenn die dateigröße unter 1024 Bytes ist, soll stattdessen 1 KB ausgegeben werden
                        if (file.Length < 1024)
                        {
                            lvi.SubItems.Add("1 KB");
                        }
                        else
                        {
                            lvi.SubItems.Add(ExtraFunctions.GetFileSizeKB(Convert.ToDouble(file.Length)));
                        }
                        lvi.SubItems.Add(getView(file.FullName).ToString());
                        lvfiles.Items.Add(lvi);
                    }
                }
            }

            LoadedPath?.Invoke(_selectedpath);
        }