سؤال

بشكل غير رسمي، معظمنا يفهمون أن هناك ملفات "ثنائية" (ملفات الكائنات والصور والأفلام والأفلام والتنفيذية وتنسيقات المستندات الخاصة أو إلخ) وملفات "النص" (شفرة المصدر وملفات XML وملفات HTML والبريد الإلكتروني، إلخ).

بشكل عام، تحتاج إلى معرفة محتويات الملف لتتمكن من القيام بأي شيء مفيد معه، وتشكيل نقطة الرأي إذا كان الترميز هو "نص ثنائي" أو "نص"، فهذا لا يهم حقا. وبالطبع ملفات فقط تخزين بايت من البيانات بحيث تكون كل "نص ثنائي" و "النص" يعني أي شيء دون معرفة الترميز. ومع ذلك، لا يزال من المفيد التحدث عن الملفات "الثنائية" و "النص"، ولكن لتجنب الإساءة إلى أي شخص مع تعريف غير دقيق، سأستمر في استخدام علامات اقتباس "تخويف".

ومع ذلك، هناك أدوات مختلفة تعمل على مجموعة واسعة من الملفات، وبشروط عملية، تريد القيام بشيء مختلف بناء على ما إذا كان الملف هو "النص" أو "ثنائي". مثال على هذه أداة تخرج البيانات الموجودة على وحدة التحكم. سوف تبدو "النص" عادي بشكل جيد، وهو مفيد. البيانات "الثنائية" تعويث محطةك، وعادة ما لا يكون مفيدا للنظر في. يستخدم GNU GREP على الأقل هذا التمييز عند تحديد ما إذا كان يجب إخراج المباريات إلى وحدة التحكم.

لذلك، فإن السؤال هو، كيف يمكنك معرفة ما إذا كان الملف هو "نص" أو "ثنائي"؟ والتقييد هو كذلك، كيف يمكنك معرفة نظام Linux مثل نظام الملفات؟ أنا لست على علم بأي بيانات META نظام الملفات التي تشير إلى "نوع" الملف، لذلك يصبح السؤال كذلك، عن طريق فحص محتوى الملف، كيف يمكنني معرفة ما إذا كان "نص" أو "ثنائي"؟ وبالنسبة للبساطة، يتيح لك تقييد "النص" أن تعني الأحرف القابلة للطباعة على وحدة التحكم في المستخدم. وعلى وجه الخصوص كيف يمكنك ينفذ هذه؟ (اعتقدت أن هذا كان ضمنا على هذا الموقع، لكنني أعتقد أنه مفيد، بشكل عام، يجب الإشارة إلى التعليمات البرمجية الموجودة التي لا يجب أن تكون قد حددها)، وأنا لست حقا بعد ما يمكن أن تستخدم البرامج الحالية للقيام بها هذه.

هل كانت مفيدة؟

المحلول

برنامج جدول البيانات يجعل شركتي يقرأ عددا من تنسيقات الملفات الثنائية وكذلك الملفات النصية.

نحن ننظر أولا إلى البايت القليلة الأولى ل رقم السحر الذي ندرك. إذا لم نتعرف على العدد السحري لأي من الأنواع الثنائية التي نقرأها، فإننا ننظر إلى ما يصل إلى أول 2K بايت من الملف لمعرفة ما إذا كان يبدو أنه UTF-8., UTF-16. أو ملف نصي مشفر في الحالي رمز الصفحة نظام التشغيل المضيف. إذا مرر أي من هذه الاختبارات، فلا نفترض أنه ليس ملفا يمكننا التعامل مع وإلقاء استثناء مناسب.

نصائح أخرى

يمكنك استعمال ال file أمر. انها حفنة من الاختبارات على الملف (man file) أن تقرر ما إذا كان ثنائي أو نص. يمكنك إلقاء نظرة على / استعارة شفرة المصدر الخاصة بها إذا كنت بحاجة إلى القيام بذلك من C.

file README
README: ASCII English text, with very long lines

file /bin/bash
/bin/bash: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), stripped

يمكنك تحديد نوع التمثيل الصامت من الملف مع

file --mime FILENAME

الاختزال هو file -i على لينكس و file -I (رأس المال I) على ماكوس (انظر التعليقات).

إذا بدأت text/, ، إنه نص، وإلا ثنائي. الاستثناء الوحيد هو تطبيقات XML. يمكنك مطابقة تلك من خلال البحث عن +xml في نهاية نوع الملف.

حسنا، إذا كنت تقوم فقط بفحص الملف بأكمله، راجع ما إذا كان كل حرف قابل للطباعة isprint(c). وبعد يحصل أكثر تعقيدا قليلا في يونيكود.

لتمييز ملف unicode النصي، تقدم MSDN بعض النصائح الرائعة فيما يتعلق بما يجب القيام به.

جوهرها هو أول تفقد لأول أربع البايتات:

EF BB BF     UTF-8 
FF FE        UTF-16, little endian 
FE FF        UTF-16, big endian 
FF FE 00 00  UTF-32, little endian 
00 00 FE FF  UTF-32, big-endian 

هذا سوف اقول لك الترميز. ثم، كنت تريد استخدام iswprint(c) لبقية الأحرف في الملف النصي. بالنسبة إلى UTF-8 و UTF-16، تحتاج إلى تحليل البيانات يدويا منذ أن يمكن تمثيل حرف واحد بعدد متغير من البايتات. أيضا، إذا كنت حقا شرجي، سترغب في استخدام البديل Locale iswprint إذا كان هذا متاحا على منصة الخاص بك.

بيرل لديه سيريسي لائق. استخدم ال -B مشغل لاختبار ثنائي (وعكس ذلك، -T لاختبار النص). إليك Shell Liner One-List لسرد الملفات النصية:

$ find . -type f -print0 | perl -0nE 'say if -f and -s _ and -T _'

(لاحظ أن هؤلاء الشرطة السفلية دون دولار سبق هم صحيحون (RTFM).)

معظم البرامج التي تحاول أن تخبر الفرق استخدام مزحة، مثل فحص الأول ن بايت الملف ورؤية ما إذا كانت تلك البايتات الكل يتأهل ك "نص" أم لا (أي، هل يسقطون جميعا ضمن مجموعة من Charters ASCII للطباعة). للحصول على أدق Dishtion، هناك دائما أمر "الملف" في أنظمة مثل UNIX.

إنه موضوع قديم، ولكن ربما سيجد شخص ما هذا مفيدا. إذا كان عليك أن تقرر في البرنامج النصي إذا كان هناك شيء هو ملف، فيمكنك ببساطة القيام بذلك:

if file -i $1 | grep -q text;
then 
.
.
fi

سيحصل ذلك على نوع الملف، ومع GREP الصامت، يمكنك تحديد ما إذا كان نصها.

لسرد أسماء الملفات النصية في Dir / Subdirs الحالي:

$ grep -rIl ''

الثنائيات:

$ grep -rIL ''

للتحقق من ملف معين، قم بتعديل الأمر قليلا:

$ grep -qI '' FILE

بعد ذلك، تعني حالة الخروج "0" أن الملف هو نص؛ "1" - ثنائي. يمكن التحقق:

$ echo $؟

فحص بسيط واحد هو إذا كان لديه \0 الشخصيات. الملفات النصية لا تملكها.

كما ذكرت أنظمة التشغيل nix سابقا هذه القدرة داخل أمر الملف. يستخدم هذا الأمر ملف تكوين يحدد الأرقام السحرية الموجودة داخل العديد من هياكل الملفات الشائعة.

تم تخزين هذا الملف يسمى السحر تاريخيا في / إل سي، على الرغم من أن هذا قد يكون في / USR / مشاركة على بعض التوزيعات. يحدد الملف السحري إزاحة القيم المعروفة الموجودة داخل الملف ويمكنه بعد ذلك فحص هذه المواقع لتحديد نوع الملف.

يمكن العثور على هيكل ووصف الملف السحري من خلال استشارة الصفحة اليدوية ذات الصلة (MAN MAGIC)

أما بالنسبة للتنفيذ، فقد تم العثور عليه جيدا ملف file.c. نفسها، ومع ذلك الجزء ذو الصلة من أمر الملف الذي يحدد ما إذا كان النص قابل للقراءة أم لا هو التالي

/* Make sure we are dealing with ascii text before looking for tokens */
    for (i = 0; i < nbytes - 1; i++) {
        if (!isascii(buf[i]) ||
            (iscntrl(buf[i]) && !isspace(buf[i]) &&
             buf[i] != '\b' && buf[i] != '\032' && buf[i] != '\033'
            )
           )
            return 0;   /* not all ASCII */
    }

يمكنك استخدام libmagic وهي نسخة مكتبة UNIX file سطر الأوامر.

هناك غلاف للكثير من اللغات:

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top