الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

طريقة لحساب حجم مجلد هو و كل ما يحتويه من ملفات و مجلدات

مغلق
بدأه رامي العيساوي في 14 يوليو 2006 · 10 رد · 2,230 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

اظن ان كل شئ واضح

بحثت بالانترنت مطولا و لم اجد ضالتي لذا كتبت هذه الطريقة و اشتغلت

و اردت مشاركتم بها

public synchronized long getWsize(String path)
		{
			long total=0;
			File file = new File(path);
			File[] all=file.listFiles();
			for(int i=0;i<all.length;i++)
			{
			   long length= (all.length())/1024;
			   total=total+length;
			   if(all.isDirectory()) {
				   total=total+getWsize(all.getPath());
				   System.out.println("Wsize "+all.getPath());
			   }

			} 
			return total;
		}

Theory is when you know something, but it doesn't work. Practice is when something works, but you don't know why. Programmers combine theory and practice: Nothing works and they don't know why

#2

السلام عليكم

مشكور اخي على هذا المجهود والافادات

ولكن عندي مشاركة بسيطةوهي انه عند تعريف ال total با long فانه لن يعطي نتائج دقيقة

خصوصا عند قسمت ال length على 1024

فلذلك من الافضل تعريفه على انه double والله اعلم

الى اذا اردت ان يكون الحجم بال bytes فلن ييضيع كسور في عملية القسمة

ولو تسمح لي ان أحط هذه المشاركه

ويا ريت انه نشوف اراء أخرى

enum sizeBy {B,KB,MB,GB};
long fileCount=0,folderCount=0;
public long getWsize(String path)
 {return (long)getWsize(path,sizeBy.B);}
public synchronized double getWsize(String path,sizeBy sBy)
		{ 
			double total=0;
			boolean isRootDir=!path.substring(0,1).startsWith("+");
			if(!isRootDir)path=path.substring(1);
			   else fileCount=0;folderCount=0;
			try{File file = new File(path);
			File[] all=file.listFiles();
			for(int i=0;i<all.length;i++)
			{
			   double length=(double) all.length();///1024;
			   total=total+length;
			   if(all.isDirectory()) {
				   total=total+getWsize("+"+ all.getPath(),sBy); 
				   folderCount++;
				   System.out.println("Wsize "+all.getPath());
			   }else{fileCount++;}
			} 
			}catch(Exception e){System.out.println("Error:" +e.getMessage());}
			if(isRootDir)
			   {for(int i=0;i<sBy.ordinal();i++)total=total/1024;
				System.out.println("Folders Count = " + folderCount);
				System.out.println("Files Count = " + fileCount);
			   }

			return (total>=Long.MAX_VALUE)?total: Math.round(total);
		}

او ممكن نضع الحجم وعدد الملفات والمجلدات في كلاس وتكون قيمق ال getWsize() هذه الكلاس وتتحتوي أيضا علا دالات التحويل بين الاحجام?

تم تعديل هذه المشاركة بواسطة Mo7eb_Alrasool في 14 يوليو 2006 في 10:19

سبحانك اللهم وبحمدك أشهد ان لا اله الا أنت

أستغفرك وأتوب اليك

الهم صلي وسلم وبارك على سيدنا وحبيبنا محمد

#3
import java.io.File;

public class DirectorySize {
	private static double SUM = 0;

	public DirectorySize() {

	}

	private void getFileSize(String directorypath) {

		File file = new File(directorypath);

		File[] all = file.listFiles();
		for (int i = 0; i < all.length; i++) {
			if (all.isDirectory()) {
				getFileSize(all.getPath());

			}
			if (all.isFile()) {
				long tmp = all.length();

				System.out.println("Size " + all.getPath() + ": "
						+ (double) tmp / 1024 + " KB");
				sum(tmp);
			}

		}

	}

	private void sum(long t) {

		SUM += (double) t;

	}

	public String getTotalSize(String directorypath) {
		getFileSize(directorypath);
		return "Total Size " + directorypath + " = " + SUM / 1024;
	}
}

لست متواجد بشكل يومي

#4

:)

طولو بالكم عم نمزح...

بالنسبة للدقة اخي الكريم فلا داعي للفواصل هنا و لكن اذا ادرت فواصل فليست بمشكلة..

و شكرا لك للمشاركة و ابداء الراي

اما انت يا مجدي صاير لا تتكلم الا اكواد و كلها من ذهب اما انا فاتكلم الفضة :)

و لكن انا من النوع الذي يحب الاختصار و التقليص اكثر ما يمكن و كم انزعج اذا كان هناك سطر اضافي و ظل عليه لكي اختصره..

على كلا ننتظر راي ابو مازن فهو الحكم بيننا :)

Theory is when you know something, but it doesn't work. Practice is when something works, but you don't know why. Programmers combine theory and practice: Nothing works and they don't know why

#5
اقتباس
اما انت يا مجدي صاير لا تتكلم الا اكواد
:lol: :lol: :lol: :lol:

كلامك كمان من ذهب يا رامي وكان الك وحشة في المنتدى انا بحب اكتب الكود كامل لانه ممكن يستخدمه الشخص في كلاس اخر

تم تعديل هذه المشاركة بواسطة مجدي محمود في 14 يوليو 2006 في 20:49

لست متواجد بشكل يومي

#6

السلام عليكم

حياك الله اخي رامي العيساوي

والله انت كلامك كله من ذهب انت والاخ مجدي

بس انا ما قصدي بالدقة هي الاعداد اللي بعد الرقم النهائي للحجم

الدقة اللي انا قصدتها هي باقي قسمة كل ملف على 1024

وقليل ما تجد

all.length() mod 1024 is 0

لاحض الفرق

  System.out.println((double)2000/1024);// 1.953125
  System.out.println((long)2000/1024);  // 1

الحجم المهمل هنا هو تقريبا 1kb

الحجم المهمل يتراوح تقريبا بين 0.0009765625 و 0.9990234375 kb

وهو رقم كبير خصوصا عندما يكثر عدد الملفات

اي ان المساحة الضائعة عنا هي مجموع الملفاي * باقي قسمة كل ملف على 1024

والله اعلم

صراحة انا استفدت كثير من مشاركتي معكم وفي المنتدي الرائع

سبحانك اللهم وبحمدك أشهد ان لا اله الا أنت

أستغفرك وأتوب اليك

الهم صلي وسلم وبارك على سيدنا وحبيبنا محمد

#7

أففف يا رامي ،، لماذا؟؟ يعني لازم أكون قاطع طريق؟؟ ويزعلوا مني الإخوان؟! طيب أنت رضيتني حكما، يمكن هم لم يرضوا ويمكن هم من يحكموا علي!!

عموما،،سأتطرق إلى التصميم ولن أتطرق إلى تقنية الحساب نفسها.

تختلف الآراء والسبب عدم وضوح الهدف.. يعني كل منكم كتب شفرة هدفها حساب حجم المجلدات، ولكنه عنده تصور بأنه يريد شيئا لم يهتم به الآخر..

مثلا رامي هدفه صنع (مكتبة) لحساب حجم المجلد بالبايت وكفى، وصُنع أمرٍ يعطي الناتج وهذا method يبدو كأمر من مكتبة شفرات، وهذه ميزة! نضيف إلى ذلك أن المعلومات غير كافية... فما هو هدف الفئة أو class الذي يحتوي هذا الأمر getWsize؟ يعني إذا كانت الفئة عامة وليس لها هدف فكان من الأفضل أن تكون العملية static! لكنا لا ندري ما وظيفة الفئة!

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

نضيف أيضا،، أنه يستطيع تطوير (برنامجه ليصبح مكتبة يستفيد منها الإخوة) بأن يوفر أوامر ترجع المعلومات إلى السياق بدلا من عرضها مباشرة! يعني مثلا تكون getWSize هدفها الإرجاع (المكتبة) ويصنع أوامر أخرى هدفها العرض(البرنامج).

أما أخونا مجدي، فقد صنع (مكتبة) لكن وظيفتها غير واضحة أبدا.. نلاحظ أيضا أنه الوحيد الذي ذكر اسم الفئة بين محاولات الإخوان وهذه ميزة لأنه يريد الوضوح،،

لكن الوهلة الأولى، يبدو من الفئة أن وظيفتها حساب حجم المجلدات فقد سماها DirectorySize. طبعا لم يكتب أمرا static لتعدد الاستخدامات،، لكنه بالمقابل وضع SUM لتكون static، ليتغير هدف الفئة إلى DirectorySizeCounter! لاحظ أن المكتبة لا تدعم تعدد الاستخدام حتى لو صنعت 100 new من هذه الفئة..

نضيف أن أسماء الأوامر التي صنعها ماكرة! فأنت تنادي على get)FileSize) ولكنك تحصل في المقابل على void!! وعنده أمر getTotalSize (وهو الأمر الوحيد الذي يخرج معلومة مفيدة للمستخدم) وكما يبدو من الاسم أنه سيرجع int أو double أو أي رقم،، ولكن بالمقابل يرجع إلينا String مما يجعل المستخدم لهذه المكتبة لا يستفيد منها في حساباته!!

الملخص: الميزات: مجدي هو الوحيد الذي صنع فئة،، والمحب صنع برنامجا أكثر من كونها مكتبة، ورامي صنع مكتبة من السهل أن يستخدمها المبرمج بسرعة في برنامجه.

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

لو كنت سأستخدم شفرة واحدة من هذه مباشرة،، لاستخدمت شفرة رامي!

-----

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

1- أن تكون المكتبة هدفها إرجاع المعلومات كلها لمجلد ما. (فائدة من شفرة (محب الرسول))

2- صنع فئة وظيفتها تسهيل استخدامها للمبرمج. (فائدة من شفرة مجدي)

3- أن تكون مباشرة، فلا يحتاج المبرمج إلى عمل الكثير ليحصل على المعلومة التي يريد! (فائدة من رامي)

الفئة سيكون اسمها FolderInfo لأنها ستحتوي على معلومات المجلد،، هدف واضح،، ما رأيكم؟

نريد عملية static ترجع لنا FolderInfo حتى يستفيد المبرمج من العملية مباشرة.

FolderInfo ستجمع هذه المعلومات. مع إمكانية عمل إضافة على المعلومات لو أراد المستخدم ذلك!

package test;
import java.io.*;
import java.util.*;
class FileInfo{
	private int folderCount, fileCount;
	private long folderSize;
	private List<String> paths;
	/**PRIVATE constructor, no need for the programer to access this.
	 */
	private FileInfo(){
		this.paths=new ArrayList<String>();
	}

	public int getFolderCount(){return folderCount;}
	public int getFileCount(){return fileCount;}
	public long getFolderSize(){return folderSize;}
	public List<String> getPaths(){return new ArrayList<String>(paths);}
	/**This is used if you want to add the info together into one FileInfo
	 */
	public void addFileInfo(String path)throws IOException{
		FileInfo fi=getFileInfo(path);
		paths.add(path);
		folderCount+=fi.folderCount;
		fileCount+=fi.fileCount;
		folderSize+=fi.folderSize;
	}
	/**Main Utility method.
	 */
	public static FileInfo getFileInfo(String path)throws IOException{
		FileInfo fi=new FileInfo();

		boolean isRootDir=!path.substring(0,1).startsWith("+");
		if(!isRootDir)path=path.substring(1);
		fi.paths.add(path);
		File file = new File(path);
		File[] all=file.listFiles();
		for(int i=0;i<all.length;i++){
			System.out.print(".");
			   long length=all.length();///1024;
			   fi.folderSize+=length;
			   if(all.isDirectory()) {
				   fi.addFileInfo(all.getPath());
			   fi.folderCount++;

			   }else{fi.fileCount++;}
		}
	   return fi;

	}
}
public class FileInfoTest{
	public static void main(String[]args)throws Exception{
		String path="C:/Documents and Settings/Free User/My Documents";
		FileInfo fs=FileInfo.getFileInfo(path);
		System.out.println("Paths: "+fs.getPaths());
		System.out.println("Folder Count: "+fs.getFolderCount());
		System.out.println("File Count: "+fs.getFileCount());
		System.out.println("Folder Size: "+fs.getFolderSize());

	} 
}

هل أعجبتك يا رامي هذه الفلسفة؟ جعلت الإخوان يزعلون مني! وكبرت الموضوع أكثر مما ينبغي وكأنه مشروع تخرج!! عموما الشفرة مفتوحة للانتقاد!

تم تعديل هذه المشاركة بواسطة حسام الملحم أبومازن في 14 يوليو 2006 في 22:29

#8

فعلا وبكل صراحة حكم رائع وكلامه احلى من الذهب

لست متواجد بشكل يومي

#9

السلام عليكم اخونا وخبيرنا ابو مازن

مشكور كثير على تعليقك المفيد جدا

انا لم يكن هدفي عمل مكتبة او اي شيئ كل هدفي كان عن توضيح مسئلة الحجم

اقتباس
السلام عليكم

حياك الله اخي رامي العيساوي

والله انت كلامك كله من ذهب انت والاخ مجدي

بس انا ما قصدي بالدقة هي الاعداد اللي بعد الرقم النهائي للحجم

الدقة اللي انا قصدتها هي باقي قسمة كل ملف على 1024

وقليل ما تجد

all.length() mod 1024 is 0

لاحض الفرق

  System.out.println((double)2000/1024);// 1.953125
  System.out.println((long)2000/1024);  // 1

الحجم المهمل هنا هو تقريبا 1kb

الحجم المهمل يتراوح تقريبا بين 0.0009765625 و 0.9990234375 kb

وهو رقم كبير خصوصا عندما يكثر عدد الملفات

اي ان المساحة الضائعة عنا هي مجموع الملفاي * باقي قسمة كل ملف على 1024

وايضا انا في نهاية المشاركة وعت تعليق

اقتباس
او ممكن نضع الحجم وعدد الملفات والمجلدات في كلاس وتكون قيمق ال getWsize() هذه الكلاس وتتحتوي أيضا علا دالات التحويل بين الاحجام?

اما بانسبة لل

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

فالبرنامج سيضق قيمة المتغيرا في كل مرة جديدة

ربما لم تلاحض الكود التالي سهوا

if(!isRootDir)path=path.substring(1);
			   else fileCount=0;folderCount=0;

هذا البرنامج الجديد بعد التعديلات

package Folders;
import java.io.*;
class FolderInfo
{
	  FolderInfo(String path){this.path=path;}
	  public String path="";
	  public long folderCount=0,fileCount=0;
	  public double total =0;
	  public long getByteSize()
	  {return (long)total;}
	  public float getKBSize()
	  {return (float)(total/1024);}
	  public float getMBSize()
	  {return (float)(total/1024/1024);}	  
	  public float getGBSize()
	  {return(float)(total/1024/1024/1024);}   
	  public static String FormatSize(double size)
	   { 
		 String retVal=Double.toString(size);
		 //26.329855 will return 26.33		 
		 if(retVal.indexOf(".")==-1){return ""+(long)Double.parseDouble(retVal);}
		 String dec=retVal.substring(retVal.indexOf(".")+1);
		 retVal=retVal.substring(0,retVal.indexOf("."));
		 if(dec.length()>2)
			{retVal+="."+(Integer.parseInt(dec.substring(0,2))+Math.round(Float.parseFloat("0."+dec.substring(2))) );
			 }else{retVal+="."+dec;}
		 return retVal;
	  }
}


class Folder
 {
   public static FolderInfo getFolderInfo(String path)
   {   FolderInfo retInfo=getFolderInfo(new FolderInfo(path));
	   retInfo.path=path;
	   return retInfo;   }

   private static synchronized FolderInfo getFolderInfo(FolderInfo objInfo)//,sizeBy sBy)
		{
			double total=0;
			String path=objInfo.path;
			boolean isRootDir=!path.substring(0,1).startsWith("+");
			if(!isRootDir)path=path.substring(1);
			   else {objInfo.fileCount=0;objInfo.folderCount=0;}

			try{File file = new File(path);
			File[] all=file.listFiles();
			for(int i=0;i<all.length;i++)
			{
			   double length=(double) all.length();
			   objInfo.total=objInfo.total+length;
			   if(all.isDirectory()) {
				   objInfo.path="+"+all.getPath(); 
				   objInfo.folderCount++;
				   objInfo=getFolderInfo(objInfo); 
				   //System.out.println("Wsize "+all.getPath());
			   }else{objInfo.fileCount++;}
			} 
			}catch(Exception e){System.out.println("Error:" +e.getMessage());}		 
			return objInfo;
		}

 }

public class Main {  
   public static void main(String args[])
   {FolderInfo finf=Folder.getFolderInfo("C:\\Program Files\\Java");
	System.out.println("Folder Path ="+finf.path);
	System.out.println("Folders	 ="+finf.folderCount);
	System.out.println("Files	   ="+finf.fileCount);
	System.out.println("Total Bytes =" +finf.getByteSize());
	System.out.println("Total KB	=" +finf.FormatSize(finf.getKBSize()));
	System.out.println("Total MB	=" +finf.FormatSize(finf.getMBSize()));
   }

}

تم تعديل هذه المشاركة بواسطة Mo7eb_Alrasool في 15 يوليو 2006 في 01:17

سبحانك اللهم وبحمدك أشهد ان لا اله الا أنت

أستغفرك وأتوب اليك

الهم صلي وسلم وبارك على سيدنا وحبيبنا محمد

#10

هيييييييييييه المهم انا الي فزت و لكن هذا ليس فوز لانه شهد شاهد من اهله :)

انا بالحقيقة لا احب التعقيد ابدا و كلما قدرت على حذف سطر لا اقصر ابدا

اذا كانت طريقة واحدة كما وضعتها استطاع المبرمج وضعها ضمن كوده و بكل بساطة

اما البرنامج الاخير فهو برأي جيد جدا و يسهل العمل جدا..

و الذي جرى هنا حلو بانه وضع كود صغير و تطور خلال ايام قليلة من خلال مناقشات هادفة الى مكتبة تفيد كافة المبرجين ... اتمنى يا اخي محب ان تضع doc لهذه المكتبة و نضعها في مجلد و احد و نعمل لها بعض الدعاية و الاعلان لكي يستفيد منها المبرمجين ...

اتمنى ان نستمر بهذا المنوال بباقي المواضع... لدي مثل هذه الشفرات الكثير ... فلنجهز نفسنا :)

Theory is when you know something, but it doesn't work. Practice is when something works, but you don't know why. Programmers combine theory and practice: Nothing works and they don't know why

#11

السلام عليكم

حياك الله اخ رامي ومشكور على ردك الجميل

وحيا الله خبيرنا ابو مازن و مجدي

وان شاء الله نواصل المناقشة الهادفة عشان تعم الفائدة والكل يستفيد

وأنا كنت اول المستفيدين من خبراتكوا

:)

سبحانك اللهم وبحمدك أشهد ان لا اله الا أنت

أستغفرك وأتوب اليك

الهم صلي وسلم وبارك على سيدنا وحبيبنا محمد

هذا الموضوع مغلق.

مواضيع مشابهة