1. რატომ უნდა გამოვიყენო using statement?
პასუხი: using statement ავტომატურად ანთავისუფლებს რესურსებს
(ფაილების handles, მეხსიერება) კოდის ბლოკის დასრულების შემდეგ, მაშინაც კი თუ
exception მოხდება. ეს აცილებს მეხსიერების გადინებას და ფაილების "ჩაკეტვას".
2. როგორ შევამოწმო ფაილი დაკავებული ხომ არ არის?
პასუხი:
public static bool IsFileLocked(string filePath)
{
try
{
using (FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read,
FileShare.None))
{
stream.Close();
}
}
catch (IOException)
{
return true; // ფაილი დაკავებულია
}
return false;
}
3. რა განსხვავებაა SearchOption.TopDirectoryOnly და
AllDirectories შორის?
პასუხი:
- TopDirectoryOnly: ეძებს მხოლოდ მითითებულ დირექტორიაში,
ქვე-დირექტორიებში არა
- AllDirectories: ეძებს მითითებული დირექტორიისა და მისი ყველა
ქვე-დირექტორიის ჩათვლით (recursive)
4. როგორ გავიგო ფაილის რეალური ტიპი, არა მარტო extension?
პასუხი: Windows-ში შეგიძლიათ P/Invoke გამოიყენოთ, ან third-party
ბიბლიოთეკები:
// File signature (Magic Numbers) შემოწმება
public static bool IsPdfFile(string filePath)
{
byte[] pdfSignature = { 0x25, 0x50, 0x44, 0x46 }; // %PDF
using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
byte[] buffer = new byte[4];
fs.Read(buffer, 0, 4);
return buffer.SequenceEqual(pdfSignature);
}
}
5. როგორ ვამუშაო ძალიან დიდ ფაილებს?
პასუხი: გამოიყენეთ streaming და chunked reading:
public static void ProcessLargeFile(string filePath)
{
const int bufferSize = 64 * 1024; // 64KB chunks
using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
byte[] buffer = new byte[bufferSize];
int bytesRead;
while ((bytesRead = fs.Read(buffer, 0, bufferSize)) > 0)
{
// buffer-ის დამუშავება...
ProcessChunk(buffer, bytesRead);
}
}
}
6. როგორ ვაკეთო atomic file operations?
პასუხი: გამოიყენეთ temp file და შემდეგ rename:
public static void WriteFileSafely(string filePath, string content)
{
string tempPath = Path.GetTempFileName();
try
{
// ჯერ temp ფაილში ჩაწერე
File.WriteAllText(tempPath, content);
// შემდეგ rename (atomic operation)
File.Move(tempPath, filePath);
}
catch
{
// თუ შეცდომა მოხდა, temp ფაილი წავშალოთ
if (File.Exists(tempPath))
File.Delete(tempPath);
throw;
}
}