چگونگی جمع آوری یک پوشه از مطالعات DICOM
این راهنمای نشان می دهد که چگونه برای جمع آوری چندین فایل DICOM از یک پوشه با استفاده از C#. هنگامی که با صدها یا هزاران فایل تصویر پزشکی کار می کند، پردازش مجموعه برای بهره وری و سازگاری ضروری است.
مزایای استفاده از Batch Anonymization
بهره وری:- تمام مطالعات یا آرشیوها را در یک عملیات انجام دهید.
آموزش متناسب:- همان قوانین ناشناس سازی را برای تمام فایل ها اعمال کنید.
اتوماسیون:- یکپارچه سازی در جریان های کار و لوله های اتوماتیک
برچسب ها: آماده سازی محیط زیست
- Visual Studio یا هر IDE .NET سازگار را نصب کنید.
- ایجاد یک برنامه جدید .NET 8 کنسول.
- نصب Aspose.Medical از NuGet Package Manager.
- فاکتور ورودی را با فایل های DICOM آماده کنید و یک پوشه خروجی ایجاد کنید.
راهنمای گام به گام برای جمع آوری فایل های DICOM ناشناس
مرحله اول: نصب Aspose.Medical
کتابخانه Aspose.Medical را به پروژه خود با استفاده از NuGet اضافه کنید.
Install-Package Aspose.Medicalمرحله دوم: فضای نام مورد نیاز را شامل کنید
ارجاعات را به فضاهای نام مورد نیاز در کد خود اضافه کنید.
using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Anonymization;مرحله سوم: راه های دایرکتوری را تنظیم کنید
مسیرهای دایرکتوری ورودی و خروجی خود را تعریف کنید.
string inputDirectory = @"C:\DicomStudies\Input";
string outputDirectory = @"C:\DicomStudies\Anonymized";
// Ensure output directory exists
Directory.CreateDirectory(outputDirectory);مرحله چهارم: فهرست فایل های DICOM
دریافت تمام فایل های DICOM از دایرکتوری ورودی، از جمله فرعی.
string[] dicomFiles = Directory.GetFiles(
inputDirectory,
"*.dcm",
SearchOption.AllDirectories
);
Console.WriteLine($"Found {dicomFiles.Length} DICOM files to process.");مرحله پنجم: ایجاد ناشناس
یک مثال ناشناس را با پروفایل مورد نظر خود ایجاد کنید.
Anonymizer anonymizer = new();
// Or with a custom profile:
// ConfidentialityProfile profile = ConfidentialityProfile.CreateDefault(
// ConfidentialityProfileOptions.BasicProfile
// );
// Anonymizer anonymizer = new(profile);مرحله 6: هر فایل را پردازش کنید
از هر فایل عبور کنید، آن را ناشناس کنید و به دایرکتوری خروجی ذخیره کنید.
int successCount = 0;
int failCount = 0;
foreach (string filePath in dicomFiles)
{
try
{
// Load DICOM file
DicomFile dcm = DicomFile.Open(filePath);
// Anonymize
DicomFile anonymizedDcm = anonymizer.Anonymize(dcm);
// Preserve relative directory structure
string relativePath = Path.GetRelativePath(inputDirectory, filePath);
string outputPath = Path.Combine(outputDirectory, relativePath);
// Ensure subdirectory exists
Directory.CreateDirectory(Path.GetDirectoryName(outputPath)!);
// Save anonymized file
anonymizedDcm.Save(outputPath);
successCount++;
Console.WriteLine($"✓ Processed: {relativePath}");
}
catch (Exception ex)
{
failCount++;
Console.WriteLine($"✗ Failed: {filePath} - {ex.Message}");
}
}
Console.WriteLine($"\nCompleted: {successCount} succeeded, {failCount} failed.");نمونه کامل کد برای Batch Anonymization
در اینجا یک نمونه کامل از نشان دادن ناشناس شدن مجموعه با گزارش پیشرفت است:
using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Anonymization;
string inputDirectory = @"C:\DicomStudies\Input";
string outputDirectory = @"C:\DicomStudies\Anonymized";
// Ensure output directory exists
Directory.CreateDirectory(outputDirectory);
// Get all DICOM files
string[] dicomFiles = Directory.GetFiles(inputDirectory, "*.dcm", SearchOption.AllDirectories);
Console.WriteLine($"Found {dicomFiles.Length} DICOM files to process.\n");
// Create anonymizer
Anonymizer anonymizer = new();
int successCount = 0;
int failCount = 0;
int total = dicomFiles.Length;
foreach (string filePath in dicomFiles)
{
try
{
DicomFile dcm = DicomFile.Open(filePath);
DicomFile anonymizedDcm = anonymizer.Anonymize(dcm);
string relativePath = Path.GetRelativePath(inputDirectory, filePath);
string outputPath = Path.Combine(outputDirectory, relativePath);
Directory.CreateDirectory(Path.GetDirectoryName(outputPath)!);
anonymizedDcm.Save(outputPath);
successCount++;
// Progress reporting
double progress = (double)(successCount + failCount) / total * 100;
Console.WriteLine($"[{progress:F1}%] ✓ {relativePath}");
}
catch (Exception ex)
{
failCount++;
Console.WriteLine($"✗ Failed: {Path.GetFileName(filePath)} - {ex.Message}");
}
}
Console.WriteLine($"\n========================================");
Console.WriteLine($"Batch Anonymization Complete");
Console.WriteLine($"Succeeded: {successCount}");
Console.WriteLine($"Failed: {failCount}");
Console.WriteLine($"========================================");پردازش همزمان برای عملکرد بهتر
برای مجموعه های داده های بزرگ، از پردازش موازی برای استفاده از چندین هسته CPU استفاده کنید:
using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Anonymization;
using System.Collections.Concurrent;
string inputDirectory = @"C:\DicomStudies\Input";
string outputDirectory = @"C:\DicomStudies\Anonymized";
Directory.CreateDirectory(outputDirectory);
string[] dicomFiles = Directory.GetFiles(inputDirectory, "*.dcm", SearchOption.AllDirectories);
Console.WriteLine($"Found {dicomFiles.Length} DICOM files to process.\n");
// Thread-safe counters
int successCount = 0;
int failCount = 0;
ConcurrentBag<string> failedFiles = new();
// Process in parallel
Parallel.ForEach(dicomFiles, new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount }, filePath =>
{
try
{
// Each thread gets its own anonymizer instance
Anonymizer anonymizer = new();
DicomFile dcm = DicomFile.Open(filePath);
DicomFile anonymizedDcm = anonymizer.Anonymize(dcm);
string relativePath = Path.GetRelativePath(inputDirectory, filePath);
string outputPath = Path.Combine(outputDirectory, relativePath);
lock (outputDirectory) // Ensure directory creation is thread-safe
{
Directory.CreateDirectory(Path.GetDirectoryName(outputPath)!);
}
anonymizedDcm.Save(outputPath);
Interlocked.Increment(ref successCount);
}
catch (Exception ex)
{
Interlocked.Increment(ref failCount);
failedFiles.Add($"{filePath}: {ex.Message}");
}
});
Console.WriteLine($"\nBatch Anonymization Complete");
Console.WriteLine($"Succeeded: {successCount}");
Console.WriteLine($"Failed: {failCount}");
if (failedFiles.Any())
{
Console.WriteLine($"\nFailed files:");
foreach (string failure in failedFiles)
{
Console.WriteLine($" - {failure}");
}
}نسخه پیشرفته با Logging
برای محیط های تولید، سوابق مناسب را اجرا کنید:
using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Anonymization;
string inputDirectory = @"C:\DicomStudies\Input";
string outputDirectory = @"C:\DicomStudies\Anonymized";
string logFile = Path.Combine(outputDirectory, "anonymization_log.txt");
Directory.CreateDirectory(outputDirectory);
string[] dicomFiles = Directory.GetFiles(inputDirectory, "*.dcm", SearchOption.AllDirectories);
Anonymizer anonymizer = new();
List<string> logEntries = new();
logEntries.Add($"Anonymization started: {DateTime.Now}");
logEntries.Add($"Input directory: {inputDirectory}");
logEntries.Add($"Output directory: {outputDirectory}");
logEntries.Add($"Total files to process: {dicomFiles.Length}");
logEntries.Add("---");
int successCount = 0;
int failCount = 0;
foreach (string filePath in dicomFiles)
{
string relativePath = Path.GetRelativePath(inputDirectory, filePath);
try
{
DicomFile dcm = DicomFile.Open(filePath);
DicomFile anonymizedDcm = anonymizer.Anonymize(dcm);
string outputPath = Path.Combine(outputDirectory, relativePath);
Directory.CreateDirectory(Path.GetDirectoryName(outputPath)!);
anonymizedDcm.Save(outputPath);
successCount++;
logEntries.Add($"SUCCESS: {relativePath}");
}
catch (Exception ex)
{
failCount++;
logEntries.Add($"FAILED: {relativePath} - {ex.Message}");
}
}
logEntries.Add("---");
logEntries.Add($"Anonymization completed: {DateTime.Now}");
logEntries.Add($"Succeeded: {successCount}");
logEntries.Add($"Failed: {failCount}");
// Write log file
File.WriteAllLines(logFile, logEntries);
Console.WriteLine($"Processing complete. Log saved to: {logFile}");بهترین روش های پردازش باتچ
- نمایش روی کپی داده ها: همیشه یک نسخه از داده های اصلی شما را پردازش می کند، نه خود اصلی ها.
- Log All Operations: ذخیره سوابق دقیق از فایل های پردازش شده و هر گونه خطا روبرو شده است.
- Test First: قبل از پردازش کل مجموعه داده، بر روی یک نمونه کوچک اجرا کنید.
- ** فضای دیسک مانیتور**: فضای کافی برای فایل های خروجی را فراهم می کند.
- توقف های معامله: در نظر داشته باشید که برای بسته های بسیار بزرگ، عملکرد نقطه بررسی / بازخورد را اجرا کنید.
Troubleshooting
مشکلات حافظه با داده های بزرگ
برای فایل های بسیار بزرگ یا مجموعه های داده، پردازش فایل ها یک به یک بدون نگه داشتن مرجع:
foreach (string filePath in dicomFiles)
{
using (DicomFile dcm = DicomFile.Open(filePath))
{
DicomFile anonymizedDcm = anonymizer.Anonymize(dcm);
anonymizedDcm.Save(outputPath);
}
// Files are disposed after each iteration
}اشتباهات اجازه
اطمینان حاصل کنید که برنامه شما دسترسی به دایرکتوری ورودی را خوانده است و دسترسی را به دفترچه خروجی بنویسید.
نتیجه گیری
این راهنمای نشان داده است که چگونه به جمع آوری فایل های DICOM در C# با استفاده از Aspose.Medical. چه پردازش صدها یا هزاران فایل، رویکرد مجموعه تضمین ناشناس یکپارچه در سراسر مجموعه داده خود را در حالی که ارائه ردیابی پیشرفت و مدیریت خطا برای قابلیت اطمینان تولید.