Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
vesel.fil
Člen
Avatar
vesel.fil:21.2.2014 20:19

Ahoj, nedávno jsem narazil na problém. Potřebuji přesunout složku z jednoho diskového oddílu na druhý, ale když se o to pokusím dostanu nějakou IOException, že nemohu kopírovat soubory přes oddíly. Je nějaký způsob jak to obejít? (Jsem si téměř jist že je :))

Odpovědět
21.2.2014 20:19
I don't necessarily agree with everything I say.
Avatar
Odpovídá na vesel.fil
Michal Žůrek - misaz:21.2.2014 20:32

no spíš bychom potřebovali vědět přes co za IOException i s celým popisem chyby to bylo.

 
Nahoru Odpovědět
21.2.2014 20:32
Avatar
vesel.fil
Člen
Avatar
Odpovídá na Michal Žůrek - misaz
vesel.fil:21.2.2014 20:50

An unhandled exception of type 'System.IO.IO­Exception' occurred in mscorlib.dll

Additional information: Source and destination path must have identical roots. Move will not work across volumes.

Tohle přesně. Po překladu je to něco ve smyslu že zdroj a cíl musí mít stejný root.

Nahoru Odpovědět
21.2.2014 20:50
I don't necessarily agree with everything I say.
Avatar
Odpovídá na vesel.fil
Luboš Běhounek Satik:21.2.2014 21:16

Přesouvat lze jen na jednom disku, nepřesouvají se totiž data, ale jen se přepisuje, ve které složce jsou soubory umístěné.

Musis tedy kopirovat a pak starou slozku smazat :)

Nahoru Odpovědět
21.2.2014 21:16
https://www.facebook.com/peasantsandcastles/
Avatar
vesel.fil
Člen
Avatar
vesel.fil:21.2.2014 21:59

Díky, nakonec jsem to vyřešil. A ještě jeden problém. Potřebuji projít všechny soubory a PC. Zatím jsem vymyslel toto:

private String skyrimPath()
       {
           //Goes through every each one file in the PC and tries to find the TESV.exe file
           DriveInfo[] drives = DriveInfo.GetDrives();
           String pf;
           if(Directory.Exists("C:\\Program Files (x86)")) pf = "C:\\Program Files (x86)";
           else pf = "C:\\Program Files";


           foreach (DriveInfo drive in drives)
           {
               goThrough(new DirectoryInfo(Path.Combine(drive.RootDirectory.ToString(), pf)));
               if (rec != null)
               {
                   string r = rec;
                   rec = null;
                   return r;
               }
           }
           return null;
       }

       private void goThrough(DirectoryInfo d)
       {
           try
           {

               foreach (FileInfo fi in d.GetFiles())
               {
                   Console.WriteLine(fi.FullName);
                   if (fi.Name == "TESV.exe")
                   {
                       rec = fi.FullName;
                       return;
                   }
               }

               foreach (DirectoryInfo diSourceSubDir in d.GetDirectories())
               {
                   goThrough(diSourceSubDir);
               }
           }
           catch (UnauthorizedAccessException)
           { }
       }

Jenže toto je velmi pomalé a nemyslím si že je to nějak omezováno výkonem protože CPU to vytíží asi na 18% (2 core) a HDD na 1%. Nevíte jak ho mám donutit využít veškerý dostupný výkon? Děkuji.

Editováno 21.2.2014 21:59
Nahoru Odpovědět
21.2.2014 21:59
I don't necessarily agree with everything I say.
Avatar
hanpari
Člen
Avatar
Odpovídá na vesel.fil
hanpari:22.2.2014 11:18

No, nevím, jestli to pomůže, já to vyřešil takto:

¨      /// <summary>
        /// Najde první výskyt hledaného souboru.
        /// </summary>
        class DriveSearch

        {
                private string search="";


                /// <param name="value">Název hledaného souboru.</param>
                public DriveSearch(string value)
                {
                search=value;
                this.FoundItem="NIC";
                }


                public string FoundItem { get; set; }


                public void Start()
                {

                        DriveInfo[] drives= DriveInfo.GetDrives();




                                foreach (DriveInfo d in drives) {

                                try
                                        {
                                        searchDirectory(d.Name);
                                        }

                                catch
                                        {
                                        continue;
                                        }

                                }






                }


                private void searchDirectory(string adresar)
                {



                        foreach (string dir in Directory.GetDirectories(adresar))
                        {
                                try
                                {

                                        foreach (string d in Directory.GetDirectories(dir))
                                        {
                                                searchDirectory(d);
                                        }

                                        foreach (string f in Directory.GetFiles(dir))
                                        {

                                                FileInfo fi=new FileInfo(f);

                                                if (fi.Name==this.search)
                                                {
                                                this.FoundItem=f;
                                                break;
                                                }

                                        }
                                }
                                catch
                                {
                                        //přeskočí všechny výjimky a pokračuje ve výpisu
                                        continue;
                                }

                        }



                }

A následně to vypadá takto:

public static void Main(string[] args)
        {

                long t=DateTime.Now.Ticks;
                DriveSearch d=new DriveSearch("NejakySoubor.txt");
                d.Start();
                Console.WriteLine("První nalezený výskyt je: {0}", d.FoundItem);
                t=DateTime.Now.Ticks-t;
                Console.WriteLine("Hledání trvalo {0} sekund.", t/1e7);
                Console.ReadLine();

        }

Jsem si jistý, že ti určitě někdo poradí líp. V každém případě mne to prohledalo všechny disky za 7 vteřin.

Měj se.

 
Nahoru Odpovědět
22.2.2014 11:18
Avatar
vesel.fil
Člen
Avatar
Odpovídá na hanpari
vesel.fil:22.2.2014 23:11

Ano opravdu je to o hodně rychlejší. Díky

Nahoru Odpovědět
22.2.2014 23:11
I don't necessarily agree with everything I say.
Avatar
hanpari
Člen
Avatar
hanpari:23.2.2014 6:11

Není zač, i když mne to samotného překvapuje. Takový velký rozdíl tam nevidím, jediné, co mne napadá je, že tvůj kód zpomaloval výpis do konzole.

 
Nahoru Odpovědět
23.2.2014 6:11
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.