Avatar
vesel.fil
Člen
Avatar
vesel.fil:

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):

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
Nesnáším {}, proto se jim vyhýbám.
Avatar
vesel.fil
Člen
Avatar
Odpovídá na Michal Žůrek (misaz)
vesel.fil:

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):

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
:)
Avatar
vesel.fil
Člen
Avatar
vesel.fil:

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
Redaktor
Avatar
Odpovídá na vesel.fil
hanpari:

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  +2 22.2.2014 11:18
Avatar
vesel.fil
Člen
Avatar
Odpovídá na hanpari
vesel.fil:

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
Redaktor
Avatar
hanpari:

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.