PDA

View Full Version : سوال: نمایش ایندکس با حلقه for



yekta99
سه شنبه 23 خرداد 1391, 09:06 صبح
سلام
من میخوام درایوهای کامپیوترم رو توی صفحه نمایش بدم و کنارشون هم ایندکس شون باشه
با حلقه ها تو در تو به جواب نرسیدم از چه روش دیگه ای می تونم استفاده کنم ؟ یا ایراد کدم چیه ؟

اینم کد

foreach (var item in drives)
{
for (int i = 0; i < drives.Length; i++)
{
Console.WriteLine("{0}-{1}", i, item);

}
}

چجوری می تونم ایندکس توی آرایه بذارم که بتونم بعدا ازشون استفاده کنم ؟

ahmadreza517
سه شنبه 23 خرداد 1391, 09:40 صبح
به نام تنها برنامه نویس هستی
سلام ,

از این قطعه کد استفاده کنید


string[] strDrive = Environment.GetLogicalDrives();

for(int i=0 ; i<= strDrive.Length -1;i++)
{
Console.WriteLine("Drive {0} {1}",i,strDrive[i]);
}

Console.ReadLine();

yekta99
سه شنبه 23 خرداد 1391, 11:07 صبح
ممنون از جوابتون
من میخوام از شماره درایوها استفاده کنم ولی کدم کارم نمی کنه ، ایراد داره ولی نمیدونم چجوری درستش کنم

string[] strDrive = Environment.GetLogicalDrives();
for (int i = 0; i <= strDrive.Length - 1; i++)
{
Console.WriteLine("Drive {0} {1}", i, strDrive[i]);


DriveInfo drvInfo = new DriveInfo(string.Format(@"{0}:\", strDrive[i]));
Console.WriteLine("{0},{1},{2},{3},{4}", drvInfo.DriveFormat,
drvInfo.TotalSize - drvInfo.TotalFreeSpace, drvInfo.TotalFreeSpace, drvInfo.TotalSize, drvInfo.DriveType);


Console.WriteLine("Enter Index of drive:");
int indx = int.Parse(Console.ReadLine());

if (i == indx)
{
if (drvInfo.IsReady)
{
string[] dirs = Directory.GetDirectories(string.Format(@"{0}:\", strDrive[i]));
foreach (var dir in dirs)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine(dir);
}
string[] file = Directory.GetFiles(string.Format(@"{0}:\", strDrive[i]));
int countFile = 0;
foreach (var fl in file)
{
countFile++;
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine(fl);

}
Console.WriteLine(countFile);
}
}

}

Mahmoud.Afrad
سه شنبه 23 خرداد 1391, 12:01 عصر
شما همه کدها رو داخل حلقه نوشتید، بایستی همه اطلاعات نوشته بشه و بعد ورودی از کاربر دریافت بشه
static void Main(string[] args)
{
string[] strDrive = Environment.GetLogicalDrives();
DriveInfo drvInfo;
string[] dirs;
string[] files;

for (int i = 0; i < strDrive.Length; i++)
{
drvInfo = new DriveInfo(strDrive[i]);
if (drvInfo.IsReady)
{
Console.Write("Drive {0} {1} ", i, strDrive[i]);
Console.WriteLine("{0},{1},{2},{3},{4}", drvInfo.DriveFormat, drvInfo.TotalSize - drvInfo.TotalFreeSpace, drvInfo.TotalFreeSpace, drvInfo.TotalSize, drvInfo.DriveType);
}
}
Console.Write("Enter Index of drive:");
int indx = int.Parse(Console.ReadLine());
if (indx < strDrive.Length)
{
dirs = Directory.GetDirectories(strDrive[indx]);
if (dirs.Length > 0)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("Directories:");
foreach (var dir in dirs)
{
Console.WriteLine(dir);
}
}
Console.WriteLine("{0} directorie(s)", dirs.Length);
Console.WriteLine();

files = Directory.GetFiles(strDrive[indx]);
if (files.Length > 0)
{
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("Files:");
foreach (var file in files)
{
Console.WriteLine(file);
}
}
Console.WriteLine("{0} file(s)" , files.Length);

Console.ReadLine();
}
}

yekta99
سه شنبه 23 خرداد 1391, 22:04 عصر
1- برای شماره گذاری دایرکتوری ها و فایلها پشت سرهم باید چیکار کنم ،مثلا اگر یه ارایه مثل آرایه زیر رو تعریف کنم :

string[] subdirc = new string[files.Length + dirs.Length];
بعد متغیر اون رو باید چجوری تعریف کنم تا بتونم شماره ها رو کنار پوشه ها و فایلها چاپ کنم ؟


2- چجوری می تونم زیر پوشه ها و فایلهای مربوط به هر directory رو بشمارم ؟ میخوام وقتی دایرکتوری ها رو نمایش بدم جلوش تعداد زیر پوشه ها رو نمایش بدم . و با درخواست کاربر محتویات زیر پوشه مورد نظر نمایش داده بشه .
با DirectoryInfo نتونستم چیزی رو نمایش بدم ، از چه دستور دیگه ای میشه استفاده کرد؟

پیشاپیش از راهنماییتون ممنونم

yekta99
چهارشنبه 24 خرداد 1391, 11:16 صبح
مشکل این کد چیه ؟

string[] dirs = Directory.GetDirectories(strDrive[indx]);
string[] files = Directory.GetFiles(strDrive[indx]);
int len = files.Length + dirs.Length;
for (int i = 0; i < dirs.Length; i++)
{
Console.WriteLine("{0} {1} ",i, dirs[i]);
}
for (int i = dirs.Length; i < len; i++)
{
Console.WriteLine("{0} {1}", i, files[i]);
}


دایرکتوری ها رو نشون میده ولی برای نمایش فایل ها خطای خارج از محدوده آرایه رو میزنه

Mahmoud.Afrad
چهارشنبه 24 خرداد 1391, 11:49 صبح
شمارنده دوباره باید از صفر شروع بشه چون چنین اندیسی که شما نوشتید خارج از محدوده اندیسهای آرایه files هست(نیازی به len نیست)
string[] dirs = Directory.GetDirectories(strDrive[indx]);
string[] files = Directory.GetFiles(strDrive[indx]);
for (int i = 0; i < dirs.Length; i++)
{
Console.WriteLine("{0} {1} ", i, dirs[i]);
}
for (int i = 0; i < files.Length; i++)
{
Console.WriteLine("{0} {1}", i, files[i]);
}

yekta99
چهارشنبه 24 خرداد 1391, 12:03 عصر
این درست ولی من میخوام شماره فایلها از ادامه شماره دایرکتوری ها باشه مثلا اگر 20دایرکتوری و 10 تا فایل باشه ، دایرکتوریها از 0 تا 19 و فایلها از 20 تا 29 نمایش داده بشن

Mahmoud.Afrad
چهارشنبه 24 خرداد 1391, 12:26 عصر
کافیه در حلقه دوم تعداد دایرکنوریها رو به i (که تعداد رو مشخص میکنه نه اونی که اندیس هست) اضافه کنید
string[] dirs = Directory.GetDirectories(strDrive[indx]);
string[] files = Directory.GetFiles(strDrive[indx]);
for (int i = 0; i < dirs.Length; i++)
{
Console.WriteLine("{0} {1} ", i, dirs[i]);
}
for (int i = 0; i < files.Length; i++)
{
Console.WriteLine("{0} {1}", i + dirs.Length, files[i]);
//___________________________________^__________
}

yekta99
چهارشنبه 24 خرداد 1391, 19:04 عصر
خوب من الان میخوام بعد از نمایش دایرکتوری ها و فایلها ، کاربر شماره یک فایل یا دایرکتوری رو وارد کنه ، اگر شماره دایرکتوری بود محتویات اون رو چاپ کنه واگر فایل بود به صورت text برگردونه ، حالا مشکل من اینه که نمیدونم چجوری به زیر پوشه ها دسترسی داشته باشم .
این کدی که نوشتم ولی هیچی رو بر نمی گردونه

Console.WriteLine("\nEnter num of directory or file :");
int num = int.Parse(Console.ReadLine());

dirs = Directory.GetDirectories(string.Format(@"{0}{1}", strDrive[indx], ?));
files = Directory.GetFiles(string.Format(@"{0}{1}", strDrive[indx], ?);


if (num >= 0 || num < dirs.Length)
{

Console.WriteLine("\nDirectories:");

for (int i = 0; i < dirs.Length; i++)
{
Console.WriteLine("{0} {1} ", i, dirs[i]);
}

Console.WriteLine("\nFiles:");

for (int i = 0; i < files.Length; i++)
{
Console.WriteLine("{0} {1}", i + dirs.Length, files[i]);
}
}
else if (num >= dirs.Length || num < files.Length)
{
FileStream fs = new FileStream(string.Format(@"{0}{1}.*", strDrive[indx], dirs[num]), FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(fs, Encoding.Default);
while (!sr.EndOfStream)
{
string str = sr.ReadLine();
Console.WriteLine(str);
}
}

میخوام تا بی نهایت چاپ محتویات پوشه ها تکرار بشه

Mahmoud.Afrad
چهارشنبه 24 خرداد 1391, 22:14 عصر
کد زیر همونیه که میخواهید
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ListFilesAndDirectories
{
class Program
{
private static string[] strDrive;
private static string[] dirs;
private static string[] files;
private static DriveInfo drvInfo;
private static bool currentPathIsRoot = true;
private static string currentPath = "";
private static int num;
private static string input;

static void Main(string[] args)
{
while (true)
{
Console.WriteLine();
Console.WriteLine("Current Path: " + currentPath);
if (currentPathIsRoot)
{
strDrive = Environment.GetLogicalDrives();
for (int i = 0; i < strDrive.Length; i++)
{
drvInfo = new DriveInfo(strDrive[i]);
if (drvInfo.IsReady)
{
Console.Write("Drive {0} {1} ", i, strDrive[i]);
Console.WriteLine("{0},{1},{2},{3},{4}", drvInfo.DriveFormat, drvInfo.TotalSize - drvInfo.TotalFreeSpace, drvInfo.TotalFreeSpace, drvInfo.TotalSize, drvInfo.DriveType);
}
}
}
else
{
dirs = Directory.GetDirectories(currentPath);
if (dirs.Length > 0)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("\n" + "Directories:");

for (int i = 0; i < dirs.Length; i++)
{
Console.WriteLine("{0} {1} ", i, dirs[i]);
}
}
Console.WriteLine("{0} directorie(s)", dirs.Length);
Console.WriteLine();
files = Directory.GetFiles(currentPath);
if (files.Length > 0)
{
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("\n"+"Files:");
for (int i = 0; i < files.Length; i++)
{
Console.WriteLine("{0} {1}", i + dirs.Length, files[i]);
}
}
Console.WriteLine("{0} file(s)", files.Length);
}
Console.WriteLine('\n' + ". \t type and press to go to parent");
Console.WriteLine("..\t type and press to go to root");
Console.WriteLine("Type 'exit' and press enter to Exit!");
Console.Write("OR Enter number of your choice : ");
input = Console.ReadLine();
if (input.ToLower().Trim() == "exit")
return;
else if (input.Trim() == ".")
currentPathIsRoot = true;
else if (input.Trim() == "..")
{
// if current path is root of one of drives by (..) as input must show drive list
if (strDrive.Contains(currentPath))
currentPathIsRoot = true;
// if currnt path is one directory must show parent
else
currentPath = Directory.GetParent(currentPath).FullName;
}
else
{
num = Convert.ToInt32(input);

if (currentPathIsRoot && num >= 0 && num < strDrive.Length)
{
currentPathIsRoot = false;
currentPath = strDrive[num];
}
else if (!currentPathIsRoot)
{
// if choose is a directory
if (num >= 0 && num < dirs.Length)
{
currentPath = dirs[num];
Console.WriteLine(currentPath);
}
// if choose is a file
else if (num >= dirs.Length && num < dirs.Length + files.Length)
{
StreamReader sr = new StreamReader(files[num - dirs.Length], Encoding.Default);
while (!sr.EndOfStream)
{
Console.WriteLine(sr.ReadLine());
}
}
}
}
}
}
}
}

yekta99
چهارشنبه 24 خرداد 1391, 23:25 عصر
خیلی خیلی ممنون از اینکه وقت میذارید و به سوالاتم جواب میدید.

من تازه دارم سی شارپ رو یاد می گیریم و اول راهم ، یه قسمتهایی از این کد رو متوجه نشدم ، ممنون میشم اگه توضیح بدید .

1- currentpath چجوری مسیر رو میگیره ؟
2- currentPathIsRoot کارکردش چجوریه ؟

Mahmoud.Afrad
پنج شنبه 25 خرداد 1391, 11:22 صبح
منظور من از روت اینجا جاییه که لیست درایوها نشون داده میشه(که البته انتخاب کلمه روت اشتباه بود) . currentPathIsRoot نشون میده که باید لیست درایوها نشون داده بشه و اگر false باشه میره فایلها و فولدرها را نشون میده.
currentpath هم اگر به اینصورت هست که اگر از لیست درایوها انتخاب صورت بگیره مسیر درایو و اگر انتخاب از فولدرها باشه مسیر فولدر و اگر مورد انتخابی فایل باشه currentpath تغییری نمیکنه.
با تایپ . به لیست درایوها برمیگرده و با تایپ .. به parent (پوشه والد) میره به اینصورت که اگر مسیر فعلی مسیر ریشه یک درایو باشه با زدن .. به لیست درایوها میره و اگر نه به پوشه والد میره.