كيفية جمع مجلد من دراسات DICOM
يظهر هذا الدليل كيفية تجميع الملفات DICOM المتعددة من مجلد باستخدام C#. عند العمل مع مئات أو الآلاف من ملفات التصوير الطبي ، فإن معالجة التجميع أمر بالغ الأهمية من أجل الكفاءة والاتساق.
فوائد Batch Anonymization
الكفاءة:- إجراء جميع الدراسات أو الأرشيفات في عملية واحدة.
التوافق:- تطبيق قواعد المجهول نفسه على جميع الملفات.
التلقائي:- يتم دمجها في تدفقات العمل الآلية والأنابيب.
المعايير: إعداد البيئة
- إعداد Visual Studio أو أي .NET IDE متوافق.
- إنشاء مشروع تطبيقات .NET 8 الجديد.
- قم بتثبيت Aspose.Medical من NuGet Package Manager.
- قم بإعداد مجلد الإدخال باستخدام ملفات DICOM وخلق ملف إخراج.
خطوة بخطوة دليل لتخزين ملفات DICOM المجهولة
الخطوة 1: تثبيت Aspose.Medical
إضافة مكتبة Aspose.Medical إلى مشروعك باستخدام NuGet.
Install-Package Aspose.Medicalالخطوة 2: إدراج المساحات المطلوبة
إضافة الإشارات إلى المساحات الاسمية المطلوبة في رمزك.
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);الخطوة 4: إدراج ملفات DICOM
احصل على جميع ملفات DICOM من دليل الإدخال، بما في ذلك الدليل الفرعي.
string[] dicomFiles = Directory.GetFiles(
inputDirectory,
"*.dcm",
SearchOption.AllDirectories
);
Console.WriteLine($"Found {dicomFiles.Length} DICOM files to process.");الخطوة 5: إنشاء المجهول
قم بإنشاء مثال مجهول مع ملفك الشخصي المطلوب.
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}");
}
}تحسين النسخة مع تسجيل الدخول
بالنسبة لبيئات الإنتاج ، قم بتنفيذ التسجيل المناسب:
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}");أفضل الممارسات لعملية معالجة البطاطا
- العمل على نسخ البيانات: يتم دائمًا معالجة نسخة من بياناتك الأصلية ، وليس الأصلي نفسه.
- سجل جميع العمليات: الحفاظ على سجلات مفصلة من الملفات التي تم معالجتها وأي أخطاء وجدت.
- اختبار أولا: تشغيل عينة صغيرة قبل معالجة مجموعة البيانات بأكملها.
- مساحة القرص الشاشة: توفير مساحة قرص كافية لملفات الإخراج.
- توقف المعاملات: التفكير في تنفيذ وظائف نقطة التحقق/التراجع للقطع الكبيرة جدا.
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. سواء معالجة مئات أو الآلاف من الملفات، فإن نهج التجميع يضمن التسمية المتسقة في جميع أنحاء مجموعة البيانات الخاصة بك في حين توفير تتبع التقدم والتعامل مع الأخطاء من أجل موثوقية الإنتاج.