Diskuze: C#, operace se stringem
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 15 zpráv z 15.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Kolik těch souborů je? To číslo má vždycky stejný počet číslic? Když by se všechno potom jmenovalo "soubor.txt", jak je odlišíš?
Souborů jsou stovky, ano má to vždy stejný počet pozic.
Soubory se jmenují různě a obsahují všemožné znaky. Pouze to "_conflict-20150402-122951" má vždy stejný počet znaků.
V tom případě by se to dalo spočítat, od kterého znaku se má udělat replace. Zjistíš si celkový počet znaků od toho odečteš "ten" počet znaků a uděláš replace.
Taky mě to napadlo, ale nevím jak přesně na to, poradíš jak to přesně spočítat a jak to potom odečíst a zobrazit?
Mohl by si udělat příklad na tomto stringu "ukol45_v3_conflict-20150402-122951.txt"?
Ano, přejmenovat část názvu, který jsem si převedl do stringu. Stačí mi jen rada jak pracovat se stringem.
string nazev = "ukol45_v3_conflict-20150402-122951.txt";
int pocetznaku = nazev.Length; //celkový počet znaků
int odebrat = 29; //počet znaků, které chci odebrat
int pocatek = nazev.Length - 29; //zjistit, odkud začnu odebírat
string novynazev = nazev.Remove(pocatek, 29) + ".txt";
v programu bych to samozřejmě zkrátil, tady je to "polopaticky"...
výsledek: ukol45_v3.txt
Tak ono obecně jde se stringem dělat cokoliv. Tobě by se mohly hodit metody .Insert(), která na zvolenou pozici vloží string a .Remove(), která od zvolené pozice umaže zvolenou část stringu..
string staryNazev = @"C:\..\_conflict-20150402-122951.txt"; // prostě nějaká url na soubor
string novyNazev = String.Empty;
int pozice = staryNazev.LastIndexOf("_conflict-");
novyNazev = staryNazev.Remove(pozice + 10, 15);
novyNazev = novyNazev.Insert(pozice + 10, "novaCisla");
File.Move(staryNazev, novyNazev);
Přes LastIndexOf() si zjistím index ve stringu, kde se vyskytuje string "_conflict-", pak na zvolené pozici, kde se zvolený string nacházel přičtu jeho délku (10), abych umazával až za názvem "_conflict-" a smažu 15 znaků, což jsou jen ta tvoje čísla.. pak už jen stačí na onu pozici přes insert vložit co chci a přes File.Move provést přejmenování souboru..
Skus toto:
string nejakaPremenna = nazev.Split('_')[0].Split('.')[1];
Všem díky za pomoc.
To nejlepší řešení je od rwn, pomohlo mi pochopení funkce
LastIndexOf, to bylo to hlavní pro zdárné řešení.
výsledek vypadá takto:
string novyNazev = String.Empty;
if (file.Name.Contains("_conflict") == true)
{
int pozice = file.Name.LastIndexOf("_conflict");
novyNazev = file.Name.Remove(pozice, 25);
Console.WriteLine(novyNazev);
}
else
Console.WriteLine(file.Name);
Kdyby náhodou někoho zajímal celý program, tak zde ho přikládám:
static void Main(string[] args)
{
string cesta = @"c:\_DATA";
ListFiles(cesta);
Console.ReadLine();
}
static void ListFiles(string path)
{
DirectoryInfo directoryInfo= new DirectoryInfo(path);
if(directoryInfo.Exists)
{
FileInfo[] fileInfo= directoryInfo.GetFiles();
DirectoryInfo[] subdirectoryInfo = directoryInfo.GetDirectories();
foreach (DirectoryInfo subDirectory in subdirectoryInfo)
{
ListFiles(subDirectory.FullName);
}
foreach(FileInfo file in fileInfo)
{
if (file.Length == 0)
{
bool exists = Directory.Exists(file.DirectoryName.Replace(@"c:\", @"c:\cisteni\"));
if (!exists)
Directory.CreateDirectory(file.DirectoryName.Replace(@"c:\", @"c:\cisteni\"));
File.Move(file.FullName, Path.Combine(file.DirectoryName.Replace(@"c:\", @"c:\cisteni\"), file.Name));
Console.WriteLine(file.FullName);
}
else
{
string novyNazev = String.Empty;
if (file.Name.Contains("_conflict") == true)
{
int pozice = file.Name.LastIndexOf("_conflict");
novyNazev = file.Name.Remove(pozice, 25);
Console.WriteLine(novyNazev);
File.Move(file.FullName, Path.Combine(file.DirectoryName, novyNazev));
}
else
Console.WriteLine(file.Name);
}
}
}
}
Zobrazeno 15 zpráv z 15.