كيف يمكنني الحصول على محتويات سلسلة ناقص التمديد في كولد فيوجن؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

وعلى سبيل المثال، أريد فقط "اسم الملف" ملف في حقل. يقول لدي myimage.jpg أريد فقط لعرض "myimage" كيف يمكنني الحصول على مجرد ذلك؟

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

المحلول

استخدم وظائف قائمة لصالحك.

<cfset FileName = ListDeleteAt(FileFullName, ListLen(FileFullName, "."), ".")>

كن على علم أن هذا يعمل فقط من أجل أسماء الملفات التي <م> فعلا ملحق ملف (التي تعرف بأنها شيء بعد النقطة الأخيرة). لجعلها أكثر أمانا، وفيما يلي أفضل:

<cfset ExtensionIndex = ListLen(FileFullName, ".")>
<cfif ExtensionIndex gt 1>
  <cfset FileExt  = ListGetAt(ExtensionIndex , ".")>
  <cfset FileName = ListDeleteAt(FileFullName, ExtensionIndex, ".")>
<cfelse>
  <cfset FileExt  = "">
  <cfset FileName = FileFullName>
</cfif>

لتعقيد الأمور قليلا أبعد من ذلك: قد يكون هناك الملفات التي تبدأ بنقطة. قد يكون هناك أسماء الملفات التي تحتوي على العديد من النقاط المجاورة. وظائف قائمة بإرجاع نتائج خاطئة بالنسبة لهم، كما أنهم يتجاهلون عناصر قائمة فارغة. قد يكون هناك أيضا الملفات التي لديها نقاط، ولكن لا تمديد. هذه لا يمكن التعامل معها إذا قمت بتوفير القائمة البيضاء التمديد: ListFindNoCase(FileExt, "doc,xls,ppt,jpg"). إذا كنت تريد أن تستأثر كل هذا، ربما كنت بحاجة إلى الاستقالة إلى تعبير reguar:

<cfset FileExtRe = "(?:\.(?:doc|xls|ppt|jpg))?$">
<cfset FileName  = REReplaceNoCase(FileExtRe, FileFullName, "")>

لتقسيم اسم الملف من المسار، يوفر كولد فيوجن وظائف متميزة أيضا التعامل مع الاختلافات النظام الأساسي: GetFileFromPath() وGetDirectoryFromPath()

نصائح أخرى

والجواب Tomalak هو جيد، ولكن يمكن الحصول على هذا صعب. إعطاء ملف اسمه "mydoc.ver1.doc" (ويندوز اسم ملف صالح) الذي هو اسم الملف والذي هو امتداد؟ ما إذا كان هناك أسم دليل؟

لا يزال بإمكانك الاستفادة من وظائف قائمة لصالحك، ولكن، حتى في هذه الحالات.

ويمكنك تحليل بسهولة الملف من المسار مع

fullFileName=listLast(fieldname,"\/")

إذا كنت تحمل اسم الملف هو كل شيء قبل نقطة، ثم

theFileName=listFirst(fullFileName,".") 

وسوف يعمل.

إذا كنت تريد التأكد من أن تحصل على كل شيء ولكن ماذا بعد الفترة الماضية، ثم هناك حاجة إلى القليل من الخداع، ولكن ليس كثيرا. ليس هناك وظيفة listAllButLast() (على الرغم من شيء من هذا القبيل قد تكون موجودة على CFLIB.org) ولكن هناك طريقتان أستطيع أن أفكر في الحصول على ما كنت بعد.

fileName=reverse(listRest(reverse(fullFileName),"."))

أو

fileName=listDeleteAt(fullFileName,listLen(fullFileName,"."),".")

وكما هو الحال مع اقتراح Tomalak، ومع ذلك، فإن هذا سوف تنهار على اسم الملف الذي يفتقر إلى التمديد. سوف التفاف هذا في <cfif listLen(fullFileName,".") GT 1> حساب لذلك.

وسوف حل مقبول الحالي لا يعمل لملف لا تحتوي على التمديد.

ويمكنك حل هذه باستخدام تعبير عادي لتجريد التمديد إلا إذا كان موجودا:

<cfset FileName = rereplace( FullFileName , '\.[^.]+$' , '' ) />

و
هذا قد لا يكون مثاليا - قد يكون لديك ملف له. ولكنه لا يعتبر امتدادا - يمكنك حل هذا إما عن طريق استخدام قائمة ملحقات المعروفة لتجريد، أو عن طريق الحد من المدة امتدادا سوف تقبل (على سبيل المثال تصل 5):

<cfset FileName = rereplace( FullFileName , '\.(jpg|png|gif|bmp)$' , '' ) />
<cfset FileName = rereplace( FullFileName , '\.[^.]{1,5}$' , '' ) />

ولذا تحتاج أولا للعثور على موقف تعوزها الأخيرة (يمكن أن يكون هناك تعوزها أكثر من واحد في اسم الملف الكامل). لا أعتقد كلدفوسون لديه وظيفة الاكتشاف الذي يعمل الى الوراء، لذلك عكس سلسلة أولا:

<cfset Position = Find(".", Reverse(FullFileName))>

إذا وترجع الصفر ثم لم يكن لديك تعوزها في اسم الملف، لذلك التعامل بشكل مناسب. آخر ...

<cfset Filename = Left(FullFileName, Len(FullFileName) - Position>

واعتبارا من كولد فيوجن 9+ (ربما قبل ذلك، ولكن لا أستطيع التحقق)، في أدرج مكتبة أباتشي العموم . في غضون ذلك org.apache.commons.io.FilenameUtils. يمكنك استخدام الطرق داخل قللي من كمية العمليات اللازمة في CF للحصول على نفس (أو ما شابه) النتائج.

filepath = "some/dir/archive.tar.gz";
oUtils = createObject("java", "org.apache.commons.io.FilenameUtils");

writeDump(oUtils.getFullPath(filepath)); // "some/dir/"
writeDump(oUtils.getName(filepath)); // "archive.tar.gz"
writeDump(oUtils.getBaseName(filepath)); // "archive.tar"
writeDump(oUtils.getExtension(filepath)); // "gz"
writeDump(oUtils.getPath(filepath)); // "some/dir/"
writeDump(oUtils.getPathNoEndSeparator(filepath)); // "some/dir"
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top