Siema, piszę program który tworzy i odczytuje proste pliki tekstowe które mają szkielet np.:
name: C
price: 86$
qty: 8
sum: 688$
problem zaczyna się w linii 108, chcę stworzyć plik który będzie sumował mi wartość "sum" z plików, kiedy będą miały taką samą nazwę, np. dla pliku powyższego i poniższego:
name: C
price: 10$
qty: 1
sum: 10$
stworzy mi taki:
name: C
sum: 698$
nie wiem jak to napisać, może użyć Listy z tablicami, albo klasy.
Nie chciałem wyodrębniać kodu, więc wrzucam całość, jeśli macie jakieś uwagi co do reszty kodu to również śmiało.
Proszę bardzo o wyrozumiałość, to mój pierwszy większy program jakikolwiek napisałem.
using System;
using System.IO;
using System.Text;
namespace FileManager
{
class Program
{
static void Main()
{
// path to folder with files
string directoryPath = @"C:\...";
while (true)
{
var fileList = Directory.GetFiles(directoryPath);
// show files in console
int directoryPathLength = directoryPath.Length + 1;
var fileNumber = 0;
Console.Write("Files in directory: ");
foreach (var fileName in fileList)
{
Console.Write(fileName.Substring(directoryPathLength) + ", ");
fileNumber += 1;
}
Console.WriteLine($"\r\n\r\nTotal files: {fileNumber}");
// menu
Console.WriteLine("\n\r1. Delete all files in directory");
//Console.WriteLine("2. Delete 1 file");
Console.WriteLine("3. Generate new random file");
Console.WriteLine("4. Create new file");
Console.WriteLine("5. Open and show files");
//Console.WriteLine("6. Sum all files and create \"sum.txt\" file");
Console.WriteLine("0. Exit");
// menu control
ConsoleKeyInfo choice = Console.ReadKey(true);
var switchChoice = choice.Key.ToString();
switch (switchChoice)
{
case "D1":
// deleting all files in directoryPath
fileList = Directory.GetFiles(directoryPath);
foreach (var path in fileList)
{
File.Delete(path);
}
Console.Clear();
break;
case "D3":
// creating new random files
FileStream fsRandom = File.Create(NextFilePath(directoryPath));
Random rnd = new Random();
var randomNames = new string[]
{
"A","B","C","D","E"
};
int index = rnd.Next(randomNames.Length);
string name = randomNames[index];
int price = rnd.Next(1, 101);
int quantity = rnd.Next(1, 11);
CreateFile(fsRandom, name, price, quantity);
fsRandom.Close();
Console.Clear();
break;
case "D4":
// creating a new file (user input)
Console.Clear();
FileStream fsUserInput = File.Create(NextFilePath(directoryPath));
Console.WriteLine($"== {fsUserInput.Name.Substring(directoryPathLength)} ======");
Console.Write("name [A-E]: ");
name = Console.ReadLine();
Console.Write("price [$]: ");
price = int.Parse(Console.ReadLine());
Console.Write("qty: ");
quantity = int.Parse(Console.ReadLine());
Console.Write($"sum: {price * quantity}$");
CreateFile(fsUserInput, name, price, quantity);
fsUserInput.Close();
Console.Write("\n\r\n\rFile created");
Console.Write("\n\rPress any key to continue.. ");
Console.ReadKey();
Console.Clear();
break;
case "D5":
// reading files
Console.Clear();
fileList = Directory.GetFiles(directoryPath);
fileNumber = 0;
foreach (var path in fileList)
{
Console.WriteLine($"== {path.Substring(directoryPathLength)} ======");
StreamReader sr = new StreamReader(path);
Console.WriteLine(sr.ReadToEnd());
Console.WriteLine();
fileNumber++;
sr.Close();
}
Console.WriteLine("===================");
Console.WriteLine($"Total files: {fileNumber}");
Console.WriteLine("===================");
Console.Write("\n\rPress any key to continue.. ");
Console.ReadKey();
Console.Clear();
break;
case "D6":
// sum of all files zapisuj nazwy w tablicy/liście? Może obiekty nowej klasy? Potem sumuj
FileStream fsSum = File.Create(NextFilePath(directoryPath));
fsSum.Close();
break;
case "D0":
// exit
Environment.Exit(0);
break;
default:
Console.Clear();
break;
}
}
}
/// <summary>
/// Returns next file path in directory (ex. "...\file2.txt", because "...\file1.txt" exists)
/// </summary>
/// <param name="directoryPath">path to a directory, files will be created here</param>
/// <returns></returns>
private static string NextFilePath(string directoryPath)
{
var fileList = Directory.GetFiles(directoryPath);
var fileNumber = 1;
foreach (var fileName in fileList)
fileNumber++;
return @$"{directoryPath}\file{fileNumber}.txt";
}
/// <summary>
/// Creates a new .txt file
/// </summary>
/// <param name="fs">fs = File.Create(path)</param>
/// <param name="name">name</param>
/// <param name="price">price</param>
/// <param name="quantity">quantity</param>
private static void CreateFile(FileStream fs, string name, int price, int quantity)
{
AddText(fs, $"name:\t{name}");
AddText(fs, $"\r\nprice:\t{price}$");
AddText(fs, $"\r\nqty:\t{quantity}");
AddText(fs, $"\r\nsum:\t{price * quantity}$");
}
private static void AddText(FileStream fs, string text)
{
byte[] info = new UTF8Encoding(true).GetBytes(text);
fs.Write(info, 0, info.Length);
}
}
}