كيف يمكنك تحديد المسارات الكاملة من وسيطات سطر الأوامر اسم الملف في برنامج C ++؟

StackOverflow https://stackoverflow.com/questions/2033908

سؤال

أنا أكتب برنامجا في C ++ الذي يقبل اسم ملف كوسيطة في سطر الأوامر:

>> ./myprogram ../path/to/file.txt

أعلم أنني أستطيع ببساطة فتح FRESTEAM باستخدام argv[1], ، ولكن البرنامج يحتاج إلى مزيد من المعلومات حول الموقع الدقيق (أي اسم المسار الكامل) للملف.

فكرت في إلحاق argv[1] ل getcwd(), ومع ذلك، من الواضح أنه في المثال أعلاه كنت في نهاية المطاف /path/../path/to/file.txt. وبعد لست متأكدا ما إذا كان Febstream سيحل هذا المسار تلقائيا، ولكن حتى لو فعل ذلك، ما زلت ليس لدي المسار الكامل دون الكثير من معالجة السلسلة.

بالطبع، هذه الطريقة لن تعمل على الإطلاق إذا كان المسار المقدم كان مطلقا بالفعل. وبما أن هذا البرنامج قد يتم تشغيله على Linux / Windows / ETC، فلن يتم اكتشاف حرف "/" ببساطة لتحديد ما إذا كانت الوسيطة مسارا كاملا أم لا.

أعتقد أن هذه مشكلة شائعة إلى حد ما للتعامل مع أسماء المسارات عبر OSS متعددة. وبالتالي كيف تم إعادة تشغيل واحد اسم المسار الكامل لجدية سطر الأوامر و كيف يتم التعامل مع هذا بين أنظمة التشغيل?

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

المحلول

التعامل مع المسار هو نظام التشغيل للغاية: بعض نظام التشغيل لديها تسلسل هرمي مع جذر واحد فقط (على سبيل المثال / unix)، بعضها يحتوي على العديد من جذور أحرف محرك الأقراص LA MS-DOS؛ قد يكون لدى البعض روابط رمزية أو روابط صلبة أو أنواع أخرى من الروابط، والتي يمكن أن تجعل اجتياز صعبة. قد لا يكون لدى البعض حتى مفهوم المسار "الكنسي" إلى ملف (على سبيل المثال إذا كان الملف لديه روابط صعبة، فإنه يحتوي على أسماء متعددة، أي منها أكثر "الكنسي").

إذا حاولت القيام بمعالجة اسم المسار عبر نظام التشغيل المتعدد في Java، فأنت تعرف ما أقصده :-).

باختصار، يتم التعامل مع المسار الخاص بالاسم النظام، لذلك عليك أن تفعل ذلك بشكل منفصل لكل نظام تشغيل (عائلة)، أو استخدم مكتبة مناسبة.

يحرر:

هل يمكن أن ننظر في أباتشي وقت التشغيل المحمولة, ، أو في دفعة (C ++ رغم ذلك)، كلاهما لديه وظائف معالجة المسارات.

نصائح أخرى

... كنت في نهاية المطاف مع / Path/../Path/to/file.txt. لست متأكدا ما إذا كان Febstream سيحل هذا المسار تلقائيا، ولكن حتى لو فعل ذلك، ما زلت ليس لدي المسار الكامل دون الكثير من معالجة السلسلة.

يفعل ذلك، ويمكنك استخدام / Path/../Path/ على كل ما تريده دون مشاكل.

على أي حال، لا توجد وظيفة قياسية في C ++ للقيام بما تريد. عليك أن تفعل ذلك يدويا، ولن تكون تافهة .. أقترح عليك الحفاظ على الطريق كما هو الحال، لا ينبغي أن يسبب أي مشاكل.

إنها تعتمد على نظام التشغيل. إذا كنت تستخدم Linux، يمكنك إلقاء نظرة على RealPath (). وبعد لا شك أن النوافذ لديها شيء مماثل.

afaik لا توجد طريقة قياسية.

ومع ذلك، يمكنك تجربة هذا النهج (مكتوب في Pseudocode):

string raw_dirname=get_directory_part(argv[1])
string basename=get_filename_part(argv[1])
string cwd=getcwd()
chdir(relative_dirname)
string absolute_dirname=getcwd()
chdir(cwd)
string absolute_filename=absulute_dirname + separator + basename

ولكن لاحظ: لست متأكدا تماما إذا كانت هناك مشكلات عند تشغيل الروابط الرمزية.

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