Zireael |
Отправлено: 01 Марта, 2019 - 03:01:50
|
Эксперт
Покинул форум
Сообщений всего: 4461
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: файлы отсортированными по имени
Они и так отсортированы по имени, в лексикографическом порядке.
Если имена только из цифр состоят, то можно так:
code (Отобразить)CODE:string s[5]={"13.bmp", "2.jpg", "1.bmp", "5.png", "10.jpg"}; // вместо этого dir
sort_array(#s[0], 5); // передавать массив string и сколько сортировать элементов
for(int i=0; i<sizearray(s); i++)messagebox(s[i]);
function sort_array(string #ss, int size_array)
{
new int m[size_array];
new string name[size_array];
new string ext[size_array];
int i, j, min, imin, ii, temp;
string tmp;
for(i=0; i<size_array; i++)
{
if(regexreplace(1, #name[i], ss[i], "^(.+?)\.(.+)$", "$1") && regexreplace(1, #ext[i], ss[i], "^(.+?)\.(.+)$", "$2"))m[i]=formatsn(name[i]);
}
for(i=0; i<size_array-1; i++)
{
min=m[i]; imin=i; ii=i+1;
for(j=ii; j<size_array; j++)
{
if(m[j]<min){min=m[j]; imin=j;}
}
temp=m[i]; m[i]=m[imin]; m[imin]=temp;
tmp=ext[i]; ext[i]=m[imin]; ext[imin]=tmp;
}
for(i=0; i<size_array; i++)ss[i]=format(m[i])+"."+ext[i];
delete m; delete name; delete ext;
} |
|
|
Zireael |
Отправлено: 03 Марта, 2019 - 02:01:49
|
Эксперт
Покинул форум
Сообщений всего: 4461
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: Мне нужна такая сортировка, как в проводнике виндовса по "имени".
Пробуйте:
Сортировка массива как в 'Проводнике' (Отобразить)CODE:external(INT, "lstrcmpi", "lstrcmpiA", "Kernel32");
string path="C:\Windows\System32\drivers\etc"; // путь к папке с файлами
string s[9999];
int count_file=dir(path, #s[0]); // получить список файлов
messagebox("Найдено файлов: "+format(count_file));
sort_array(#s[0], count_file); // сортирует файлы также как 'Проводник'
for(int i=0; i<count_file; i++)messagebox(s[i]);
function sort_array(int #m, int size_array)
{
string s1[255], s2[255], min, temp;
int imin, ii, x, count1, count2, max_len, n1, n2;
new string name[size_array];
new string ext[size_array];
for(int n=0; n<size_array; n++)
{
regexreplace(1, #name[n], m[n], "^(.+?)\.(.+)$", "$1");
if(regexreplace(1, #ext[n], m[n], "^(.+?)\.(.+)$", "$2")==0)ext[n]="";
}
for(int i=0; i<size_array-1; i++)
{min=name[i]; imin=i; ii=i+1;
for(int j=ii; j<size_array; j++)
{
count1=regexsearch(-1, #s1[0], min, "\d+|.+?");
count2=regexsearch(-1, #s2[0], name[j], "\d+|.+?");
x=0;
if(count1>=count2){max_len=count1; for(n2=count2; n2<max_len; n2++)s2[n2]="";}
else {max_len=count2; for(n2=count1; n2<max_len; n2++)s1[n2]="";}
for(n1=0; n1<max_len && x==0; n1++)x=compare(s1[n1], s2[n1]);
if(x==1){min=name[j]; imin=j;}
}
temp=name[i]; name[i]=name[imin]; name[imin]=temp;
temp=ext[i]; ext[i]=ext[imin]; ext[imin]=temp;
}
for(i=0; i<size_array; i++)
{
if(ext[i]!="")m[i]=name[i]+"."+ext[i];
else m[i]=name[i];
}
delete name; delete ext;
}
function compare(string s1, string s2)
{
if(formatci(s1)==0)return -1;
if(formatci(s2)==0)return 1;
if(s1==s2)return 0;
string tmp1, tmp2;
if(regexsearch(1, #tmp1, s1, "^\d+$") && regexsearch(1, #tmp2, s2, "^\d+$"))
{
if(formatsn(tmp1)<=formatsn(tmp2))return -1; return 1;
}
char c1[255], c2[255];
strcpy(#c1[0], s1);
strcpy(#c2[0], s2);
return lstrcmpi(address(#c1[0]), address(#c2[0]));
} |
|
|
|