Pouze tento týden sleva až 80 % na e-learning týkající se C# .NET
Aktuálně: Postihly zákazy tvou profesi? Poptávka po ajťácích prudce roste, využij slevové akce 30% výuky zdarma!
C# týden
Avatar
Sperhak
Člen
Avatar
Sperhak:6. ledna 19:57

Neviem ako by som to mal spraviť. Nechcem od Vás hotový kód to by som sa nič nenaučil iba nasmerovanie alebo niečo, lebo vlastne ani neviem ako to po anglicky hladať :D

Zkusil jsem: No upravujem jednu aplikáciu k obrazu svojmu. Napísal som zaťial tento kód ktorý mi pekne funguje.

{   //Vypíše zoznam súborov ktoré sa nachádzajú v priečinku images------------------------
                        DirectoryInfo ImageDir = new DirectoryInfo("images");
                        FileInfo[] ImageFiles = ImageDir.GetFiles();
                        Console.WriteLine("List of images:");
                        foreach (FileInfo files in ImageFiles)
                        {
                                Console.WriteLine(files.Name.ToString());
                        }
                }
string ImageFilesRead = Console.ReadLine();

//nakopíruje zvolený obrázok-------------------------------------------------
                if (File.Exists(Source + "\\images" + "\\" + ImageFilesRead))
                {
                        Copy(Source + "\\images" + "\\" + ImageFilesRead, Destination + "\\" + ImageFilesRead);
                        Console.WriteLine("Image has been changed.");
                }

Do konzoly sa vypíše zoznam obrázkov napr
dedo.bmp
baba.bmp
auto.bmp

Ja potom napíšem do konzoly dedo.bmp a tento obrázok sa potom nakopíruje do priečinku.

Chci docílit: Chcel by som aby zoznam vyzeral takto:
1.dedo.bmp
2.baba.bmp
3.auto.bmp
Ja potom do konzoly napíšem 1 stlačím enter a nakopíroval by sa obrázok dedo.bmp

 
Odpovědět
6. ledna 19:57
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Sperhak
DarkCoder:6. ledna 21:28

Když si názvy souborů uložíš do pole, můžeš se na ně odkazovat prostřednictvím indexu tohoto pole.
Požadované podoby seznamu dosáhneš výpisem indexu s tečkou a hodnoty na daném indexu.

Nahoru Odpovědět
6. ledna 21:28
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
JerryM
Člen
Avatar
JerryM:7. ledna 12:42

vytvoříš si třídu t_Files do které umístíš 2 proměnné a musí být public, první typu Int32 a druhou typu String.
a pak si v tom tvým programu vytvoříš List<t_Files> files = new List<t_Files>
a pak už jenom přidáváš záznamy do Listu:
t_Files item = new t_Files()
jmeno = "dedo.bmp";
cislo = 1;
files.Add(item)

a tak dále ..

a nakonci nezapomeneš ten list zmazat

files = null;

 
Nahoru Odpovědět
7. ledna 12:42
Avatar
Michal Šebesta:7. ledna 13:00

Můžeš nahradit foreach cyklus, který ti vypisuje jména souborů do konzole, normálním for cyklem. Do

Console.WriteLine(files.Name.ToString())

ještě před

files.Name.ToString()

přidáš:

i + ": " +

To ti před každý soubor přidá číslo s dvojtečkou.
Pak si přes Console.ReadLine() načteš zadané číslo. Ještě by bylo dobré ošetřit, jestli uživatel zadal platné číslo a jestli je číslo v rozsahu 0 - ImageFiles.Length. Potom pro získání jména souboru použiješ

ImageFiles[zadaneCislo].Name

(popř. FullName pokud chceš celou adresu.
Taky by jsi měl, pokud to jde, odstranit složené závorky nad

string ImageFilesRead = Console.ReadLine();

a nad

DirectoryInfo ImageDir = new DirectoryInfo("images");

protože proměnná ImageFiles mimo ně neexistuje.

 
Nahoru Odpovědět
7. ledna 13:00
Avatar
Sperhak
Člen
Avatar
Sperhak:7. ledna 19:58

Tak som to skúšal, ale všetky obrázky majú pred sebou číslo 0, ked to zmením na for (int i = 0; i < 5; i++) Tak sa obrázky očíslujú sprvávne, ale sú tam 5x po sebe.

//Vypíše zoznam súborov ktoré sa nachádzajú v priečinku images------------------------
                        DirectoryInfo ImageDir = new DirectoryInfo("images");
                        FileInfo[] ImageFiles = ImageDir.GetFiles();
                        Console.WriteLine("List of images:");
                    foreach (FileInfo files in ImageFiles)
                        for (int i = 0; i < 1; i++)
                        {
                                Console.WriteLine(i + ": " + files.Name.ToString());
                        }
                   //------------------------------------------------------------------------------------

                int ImageFilesRead = Console.Read();



                //nakopíruje zvolený obrázok-------------------------------------------------
                if (File.Exists(Source + "\\images" + "\\" + ImageFiles[ImageFilesRead].Name))
                {
                        Copy(Source + "\\images" + "\\" + ImageFiles[ImageFilesRead].Name, Destination + "\\" + ImageFiles[ImageFilesRead].Name);
                        Console.WriteLine("Image has been changed.");
                }
                //------------------------------------------------------------------------------------------
 
Nahoru Odpovědět
7. ledna 19:58
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Sperhak
DarkCoder:7. ledna 20:57

To chování, které program vykazuje jak popisuješ, je logické. Foreach provádí traversování celého pole už samo o sobě. Pokud do něj ještě zanoříš klasický for cyklus, budeš tak provádět nad každým indexem počet iterací rovno počtu iterací, na který máš for cyklus nastaven. Jelikož potřebuješ pracovat s indexy, použij pouze samotný for cyklus.

Nahoru Odpovědět
7. ledna 20:57
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
Sperhak
Člen
Avatar
Odpovídá na DarkCoder
Sperhak:7. ledna 22:19

No ano ja som si aj myslel že to tam takto na 2x nebude dobre,ale ked vymažem foreach (FileInfo files in ImageFiles) tak mi tento riadok Console.WriteLine(i + ": " + files.Name.ToS­tring()); na files.Name.ToS­tring() hádže chybu a neviem ako to spraviť.

 
Nahoru Odpovědět
7. ledna 22:19
Avatar
Odpovídá na Sperhak
Michal Šebesta:7. ledna 22:38

Omlouvám se, přehlédl jsem to. Místo files.Name.ToS­tring() se musí použít ImageFiles[i]­.Name.ToStrin­g(). Nyní už by to foreach cyklus nemělo potřebovat. files je totiž aktuální proměnná foreach cyklu. Když ho ale nepoužíváme, musíme k souborům přistupovat pomocí indexu.

 
Nahoru Odpovědět
7. ledna 22:38
Avatar
Sperhak
Člen
Avatar
Sperhak:7. ledna 22:47

Ja som skúšal ImageFiles.Na­me.ToString() a hádzalo mi to tiež chybu ale bol som blízko :D
Žial ani ImageFiles[i]­.Name.ToStrin­g() čo si mi teraz napísal nefunguje. Hádže to chybu na Name
the name "Name" does not exist in current context syntax error

 
Nahoru Odpovědět
7. ledna 22:47
Avatar
Sperhak
Člen
Avatar
Sperhak:7. ledna 23:12

Tak som si poradil malo to byť takto ImageFiles[i].Name bez toho To String. Vyskytol sa mi však ďalší problém. Napísal som
for (int i = 0; i < 100; i++) aby som tam mal dosť velkú rezervu no aj ked napíšem (int i = 0; i < 5; i++) a obrázky v priečinku sú 4 tak to hodí chybu. A další problém že ked napíšem do konzoly 2 čo by som tak chcel zvolit ten obrázok a stlačím enter tak to tiež vypíše chybu.

 
Nahoru Odpovědět
7. ledna 23:12
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Sperhak
Člen
Avatar
Sperhak:7. ledna 23:17

Napadá ma či to nebude súvisieť s tým že som zmenil string ImageFilesRead = Console.ReadLine(); na int ImageFilesRead = Console.Read();
Zmenil som to lebo ked tam bol string tak mi ImageFiles[Ima­geFilesRead].Na­me hádzalo chybu

 
Nahoru Odpovědět
7. ledna 23:17
Avatar
Sperhak
Člen
Avatar
Sperhak:7. ledna 23:22

Tak som zasa na niečo prišiel ten int bude asi dobre napísal som si to tam takto
int ImageFilesRead = Console.Read();
Console.Write­Line(ImageFiles­Read);
a ked napíšem 3 vráti sa mi 51

 
Nahoru Odpovědět
7. ledna 23:22
Avatar
Sperhak
Člen
Avatar
Odpovídá na Sperhak
Sperhak:7. ledna 23:25

Tak som našiel odpoved na internete má to byť int ImageFilesRead = Convert.ToInt32(Con­sole.ReadLine());

 
Nahoru Odpovědět
7. ledna 23:25
Avatar
Michal Šebesta:7. ledna 23:50

Když přistupuješ ok prvkům pole pomocí [i] a i je větší než počet prvků v poli tak to vyhodí chybu. Do for cyklu můžeš dát jako délku cyklu ImageFiles.Length což je délka pole. Pak už by ti to chybu vyhodit nemělo.

 
Nahoru Odpovědět
7. ledna 23:50
Avatar
Ghst
Člen
Avatar
Ghst:8. ledna 10:03

Ahoj,

původní kód by stačilo doplnit následujícím způsobem

//tvůj kód z prvního příspěvku...
int idx = 1;     //pořadové číslo brázku

Console.WriteLine("List of images:");
 foreach (FileInfo files in ImageFiles)
 {
         Console.WriteLine(string.Format("{0}. {1}", idx, files.Name.ToString()));
        idx++;  //navýšení proměnné
 }

nebo lze nahradit cyklus foreach za for

FileInfo file;
for (int i = 0; i < ImageFiles.Length; i++)
{
   file =     ImageFiles[i];
   Console.WriteLine(i + ": " + files.Name.ToString());
}
Editováno 8. ledna 10:04
 
Nahoru Odpovědět
8. ledna 10:03
Avatar
Sperhak
Člen
Avatar
Sperhak:8. ledna 11:29

Dakujem už to funguje. Trochu ma mätie ten ImageFiles.Length což je délka pole. Nechápem tej dĺžke pola. Ono to v skutočnosti je kolko súborov sa nachádza v priečinku nie? A to by som si s dĺžkou pola sám nespojil.
Takže mám to chápať tak že dĺžka pola je vlastne počet objektov v tom poli?

 
Nahoru Odpovědět
8. ledna 11:29
Avatar
Michal Šebesta:8. ledna 11:49

Funkce ImageDir.GetFi­les(); vezme všechny položky v dané složce a uloží jejich jména a další info do pole prvků typu FileInfo. Délka tohoto pole je tedy počet souborů ve složce.

 
Nahoru Odpovědět
8. ledna 11:49
Avatar
Sperhak
Člen
Avatar
Sperhak:9. ledna 19:57

Chápem, aj ked mi to nedáva logiku že dlžka je počet súborov ale dobre skúsim si to zapamätať dobudúcna.

 
Nahoru Odpovědět
9. ledna 19:57
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Sperhak
DarkCoder:9. ledna 20:23

Je třeba to pochopit, nikoli si to pamatovat.

Je to obdobné jako počet argumentů zadaných na příkazovém řádku za názvem souboru při spuštění programu.

Např. v jazyce C, vstupní funkce main(), schopna přijímat argumenty zadané na příkazovém řádku, má následující tvar:

int main(int argc, char *argv[])

Druhý parametr je pole znakových ukazatelů. Jinak řečeno pole ukazatelů na řetězec. Každý řetězec je samostatná jednotka a velikost tohoto pole (první argument) je právě počet těchto řetězců.

Proto velikost pole odpovídá počtu souborů ve složce.

Nahoru Odpovědět
9. ledna 20:23
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
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 19 zpráv z 19.