Inna twórczość > Platforma .NET
[C#] Obsługa błędów I/O
MajkeI:
--- Kod: --- Console.WriteLine("Input directory");
string dir = Console.ReadLine();
if (!Directory.Exists(dir))
Console.WriteLine("Directory is incorrect!");
else
return dir;
return ""; // no i tutaj mam tak zostawić?
--- Koniec kodu ---
inż. Avallach:
Nieee, teraz zwróci albo katalog, albo pustego stringa. A ma zawsze zwracać katalog. Podpowiedziałem ci już że chodzi o pętlę.
--- Kod: ---public static string GetDirectory()
{
string dir = null;
while(!Directory.Exists(dir))
{
Console.WriteLine("Input directory");
dir = Console.ReadLine();
}
return dir;
}
--- Koniec kodu ---
W ten sposób metoda zawsze zrobi to co mówi jej nazwa - zwróci katalog. Nastepne metody będą mogły po prostu użyć tego co zwróci bez sprawdzania czy to katalog, bo przecież obiecała że zwróci katalog.
MajkeI:
Właśnie to napisałem ... :C tylko troche inaczej.
Ale wywala błąd cały projekt teraz
EDIT: Aaaa okej, już to widze
Jak odwołać się do katalogu powyżej?
C:\Cośtam\.. to katalog niżej, sprawdziłem, ale co jeśli chcę podkatalog wyżej o nieznanej mi nazwie?
C:\Cośtam\* oczywiście nie działa
Pobawię się, jak coś wyjdzie lub nie to dam znać. Dzięki @Avallach , @Adanos
UPDATE:
--- Kod: ---using System;
using System.IO;
namespace Program {
class Program {
public static string GetDirectory() {
string dir = null;
while (!Directory.Exists(dir)) {
Console.Clear();
Console.WriteLine("Input directory");
dir = Console.ReadLine();
}
return dir;
}
public static void ChangeNamesWithSubfolders(string dir) {
string[] filePaths = Directory.GetFiles(dir);
if (filePaths.Length == 0)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(" No files in " + dir + "!");
}
else
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine(" Changed files in " + dir + ":");
}
for (int i = 0; i < filePaths.Length; i++) {
File.Move(filePaths[i], filePaths[i].ToUpper());
filePaths[i] = Path.GetFileName(filePaths[i]);
Console.WriteLine(" - " + filePaths[i]);
}
DirectoryInfo directory = new DirectoryInfo(dir);
DirectoryInfo[] directories = directory.GetDirectories();
for (int i = 0; i < directories.Length; i++)
ChangeNamesWithSubfolders(dir + "\\" + directories[i]);
Console.ForegroundColor = ConsoleColor.Gray;
}
static void Main(string[] args) {
while (true) {
Console.Clear();
ChangeNamesWithSubfolders(GetDirectory());
Console.WriteLine("\n(Press ESCAPE to exit)");
if (Console.ReadKey().Key == ConsoleKey.Escape)
return;
}
}
}
}
--- Koniec kodu ---
Czy ten kod jest czysty?
Adanos:
Akurat metodę ChangeNamesWithSubfolders możesz podzielić na 3 mniejsze:
- jakaś metoda "info":
--- Kod: ---if (filePaths.Length == 0)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(" No files in " + dir + "!");
}
else
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine(" Changed files in " + dir + ":");
}
--- Koniec kodu ---
- zmiana nazwy:
--- Kod: ---for (int i = 0; i < filePaths.Length; i++) {
File.Move(filePaths[i], filePaths[i].ToUpper());
filePaths[i] = Path.GetFileName(filePaths[i]);
Console.WriteLine(" - " + filePaths[i]);
}
--- Koniec kodu ---
- sprawdzanie podkatalogów:
--- Kod: ---DirectoryInfo directory = new DirectoryInfo(dir);
DirectoryInfo[] directories = directory.GetDirectories();
for (int i = 0; i < directories.Length; i++)
ChangeNamesWithSubfolders(dir + "\\" + directories[i]);
Console.ForegroundColor = ConsoleColor.Gray;
--- Koniec kodu ---
Avallach już pisał to, ale nie używaj tego:
--- Kod: ---while (true)
--- Koniec kodu ---
Zadeklaruj jakąś zmienną.
MajkeI:
--- Kod: ---using System;
using System.IO;
namespace Program
{
class Program
{
public static string GetDirectory()
{
string dir = null;
while (!Directory.Exists(dir))
{
Console.Clear();
Console.WriteLine("Input directory");
dir = Console.ReadLine();
}
return dir;
}
public static void GetInfoAboutDirectory(string[] filePaths, string dir)
{
if (filePaths.Length == 0)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(" No files in " + dir + "!");
}
else
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine(" Changed files in " + dir + ":");
}
}
public static void ChangeFileNames(string[] filePaths)
{
for (int i = 0; i < filePaths.Length; i++)
{
File.Move(filePaths[i], filePaths[i].ToUpper());
filePaths[i] = Path.GetFileName(filePaths[i]);
Console.WriteLine(" - " + filePaths[i]);
}
}
public static void CheckSubfolders(string dir)
{
DirectoryInfo directory = new DirectoryInfo(dir);
DirectoryInfo[] directories = directory.GetDirectories();
for (int i = 0; i < directories.Length; i++)
ChangeNamesWithSubfolders(dir + "\\" + directories[i]);
}
public static void ChangeNamesWithSubfolders(string dir)
{
string[] filePaths = Directory.GetFiles(dir);
GetInfoAboutDirectory(filePaths, dir);
ChangeFileNames(filePaths);
CheckSubfolders(dir);
Console.ForegroundColor = ConsoleColor.Gray;
}
static void Main(string[] args)
{
bool end = false;
while (end == false)
{
Console.Clear();
ChangeNamesWithSubfolders(GetDirectory());
Console.WriteLine("\n(Press ESCAPE to exit)");
if (Console.ReadKey().Key == ConsoleKey.Escape)
end = true;
}
}
}
}
--- Koniec kodu ---
?
Nawigacja
[#] Następna strona
Idź do wersji pełnej