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ť
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
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.
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)
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");
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.");
}
//------------------------------------------------------------------------------------------
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.
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.ToString()); na
files.Name.ToString() hádže chybu a neviem ako to spraviť.
Omlouvám se, přehlédl jsem to. Místo files.Name.ToString() se musí
použít ImageFiles[i].Name.ToString(). 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.
Ja som skúšal ImageFiles.Name.ToString() a hádzalo mi to tiež chybu ale
bol som blízko
Žial ani ImageFiles[i].Name.ToString() č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
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.
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[ImageFilesRead].Name
hádzalo chybu
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.WriteLine(ImageFilesRead);
a ked napíšem 3 vráti sa mi 51
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.
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());
}
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?
Funkce ImageDir.GetFiles(); 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.
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.
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.