📄 filer.c
字号:
sel++;
if(sel==NUM_MENU) sel=0;
}while(!enable[sel]);
}else if(new_pad & PAD_CROSS)
return -1;
else if(new_pad & PAD_CIRCLE)
break;
}
// 昤夋奐巒
itoSprite(setting->color[0], 401, 32, 493, 91+8, 0);
drawFrame(402, 33, 490, 89+8, setting->color[1]);
for(i=0,y=74; i<NUM_MENU; i++){
if(i==COPY) strcpy(tmp, "Copy");
else if(i==CUT) strcpy(tmp, "Cut");
else if(i==PASTE) strcpy(tmp, "Paste");
else if(i==DELETE) strcpy(tmp, "Delete");
else if(i==RENAME) strcpy(tmp, "Rename");
else if(i==NEWDIR) strcpy(tmp, "New Dir");
else if(i==GETSIZE) strcpy(tmp, "Get Size");
if(enable[i]) color = setting->color[3];
else color = setting->color[1];
printXY(tmp, 418, y/2, color, TRUE);
y+=FONT_HEIGHT;
}
if(sel<NUM_MENU)
drawChar(127, 410, (74+sel*FONT_HEIGHT)/2, setting->color[3]);
// 憖嶌愢柧
x = SCREEN_MARGIN;
y = SCREEN_HEIGHT-SCREEN_MARGIN-FONT_HEIGHT;
itoSprite(setting->color[0],
0,
y/2,
SCREEN_WIDTH,
y/2+8, 0);
printXY("仜:OK 亊:Cancel", x, y/2, setting->color[2], TRUE);
drawScr();
}
return sel;
}
//////////////////////////////////////////////////////////////////////////
// 僼傽僀儖僒僀僘庢摼
size_t getFileSize(const char *path, const FILEINFO *file)
{
size_t size;
FILEINFO files[MAX_ENTRY];
char dir[MAX_PATH], party[MAX_NAME];
int nfiles, i, ret, fd;
if(file->attr & FIO_S_IFDIR){
sprintf(dir, "%s%s/", path, file->name);
// 懳徾僼僅儖僟撪偺慡僼傽僀儖丒僼僅儖僟僒僀僘傪崌寁
nfiles = getDir(dir, files);
for(i=size=0; i<nfiles; i++){
ret=getFileSize(dir, &files[i]);
if(ret < 0) size = -1;
else size+=ret;
}
} else {
// 僷乕僥傿僔儑儞儅僂儞僩
if(!strncmp(path, "hdd", 3)){
getHddParty(path,file,party,dir);
ret = mountParty(party);
if(ret<0) return 0;
dir[3] = ret+'0';
}else
sprintf(dir, "%s%s", path, file->name);
// 僼傽僀儖僒僀僘庢摼
if(!strncmp(path, "hdd", 3)){
fd = fileXioOpen(dir, O_RDONLY, fileMode);
size = fileXioLseek(fd,0,SEEK_END);
fileXioClose(fd);
}else{
fd = fioOpen(dir, O_RDONLY);
size = fioLseek(fd,0,SEEK_END);
fioClose(fd);;
}
}
return size;
}
////////////////////////////////////////////////////////////////////////
// 僼傽僀儖丒僼僅儖僟嶍彍
int delete(const char *path, const FILEINFO *file)
{
FILEINFO files[MAX_ENTRY];
char party[MAX_NAME], dir[MAX_PATH], hdddir[MAX_PATH];
int nfiles, i, ret;
// 僷乕僥傿僔儑儞儅僂儞僩
if(!strncmp(path, "hdd", 3)){
getHddParty(path,file,party,hdddir);
ret = mountParty(party);
if(ret<0) return 0;
hdddir[3] = ret+'0';
}
sprintf(dir, "%s%s", path, file->name);
if(file->attr & FIO_S_IFDIR){
strcat(dir,"/");
// 懳徾僼僅儖僟撪偺慡僼傽僀儖丒僼僅儖僟傪嶍彍
nfiles = getDir(dir, files);
for(i=0; i<nfiles; i++){
ret=delete(dir, &files[i]);
if(ret < 0) return -1;
}
// 懳徾僼僅儖僟傪嶍彍
if(!strncmp(dir, "mc", 2)){
mcSync(0,NULL,NULL);
mcDelete(dir[2]-'0', 0, &dir[4]);
mcSync(0, NULL, &ret);
}else if(!strncmp(path, "hdd", 3)){
ret = fileXioRmdir(hdddir);
}else if(!strncmp(path, "mass", 4)){
sprintf(dir, "mass0:%s%s", &path[5], file->name);
ret = fioRmdir(dir);
if (ret < 0){
dir[4] = 1 + '0';
ret = fioRmdir(dir);
}
}
} else {
// 懳徾僼傽僀儖傪嶍彍
if(!strncmp(path, "mc", 2)){
mcSync(0,NULL,NULL);
mcDelete(dir[2]-'0', 0, &dir[4]);
mcSync(0, NULL, &ret);
}else if(!strncmp(path, "hdd", 3)){
ret = fileXioRemove(hdddir);
}else if(!strncmp(path, "mass", 4)){
ret = fioRemove(dir);
}
}
return ret;
}
////////////////////////////////////////////////////////////////////////
// 僼傽僀儖丒僼僅儖僟儕僱乕儉
int Rename(const char *path, const FILEINFO *file, const char *name)
{
char party[MAX_NAME], oldPath[MAX_PATH], newPath[MAX_PATH];
int ret=0;
if(!strncmp(path, "hdd", 3)){
sprintf(party, "hdd0:%s", &path[6]);
*strchr(party, '/')=0;
sprintf(oldPath, "pfs0:%s", strchr(&path[6], '/')+1);
sprintf(newPath, "%s%s", oldPath, name);
strcat(oldPath, file->name);
ret = mountParty(party);
if(ret<0) return -1;
oldPath[3] = newPath[3] = ret+'0';
ret=fileXioRename(oldPath, newPath);
}else
return -1;
return ret;
}
////////////////////////////////////////////////////////////////////////
// 怴婯僼僅儖僟嶌惉
int newdir(const char *path, const char *name)
{
char party[MAX_NAME], dir[MAX_PATH];
int ret=0;
if(!strncmp(path, "hdd", 3)){
getHddParty(path,NULL,party,dir);
ret = mountParty(party);
if(ret<0) return -1;
dir[3] = ret+'0';
//fileXioChdir(dir);
strcat(dir, name);
ret = fileXioMkdir(dir, fileMode);
}else if(!strncmp(path, "mc", 2)){
sprintf(dir, "%s%s", path+4, name);
mcSync(0,NULL,NULL);
mcMkDir(path[2]-'0', 0, dir);
mcSync(0, NULL, &ret);
if(ret == -4)
ret = -17;
}else if(!strncmp(path, "mass", 4)){
strcpy(dir, path);
strcat(dir, name);
ret = fioMkdir(dir);
}
return ret;
}
////////////////////////////////////////////////////////////////////////
// 僼傽僀儖僐僺乕
int copy(const char *outPath, const char *inPath, FILEINFO file, int n)
{
FILEINFO files[MAX_ENTRY];
char out[MAX_PATH], in[MAX_PATH], tmp[MAX_PATH],
*buff=NULL, inParty[MAX_NAME], outParty[MAX_NAME];
int hddout=FALSE, hddin=FALSE, nfiles, i;
size_t size, outsize;
int ret=-1, pfsout=-1, pfsin=-1, in_fd=-1, out_fd=-1, buffSize;
sprintf(out, "%s%s", outPath, file.name);
sprintf(in, "%s%s", inPath, file.name);
// 擖弌椡僷僗偺愝掕偲僷乕僥傿僔儑儞偺儅僂儞僩丅
if(!strncmp(inPath, "hdd", 3)){
hddin = TRUE;
getHddParty(inPath, &file, inParty, in);
if(!strcmp(inParty, mountedParty[0]))
pfsin=0;
else if(!strcmp(inParty, mountedParty[1]))
pfsin=1;
else
pfsin=-1;
}
if(!strncmp(outPath, "hdd", 3)){
hddout = TRUE;
getHddParty(outPath, &file, outParty, out);
if(!strcmp(outParty, mountedParty[0]))
pfsout=0;
else if(!strcmp(outParty, mountedParty[1]))
pfsout=1;
else
pfsout=-1;
}
if(hddin){
if(pfsin<0){
if(pfsout==0) pfsin=1;
else pfsin=0;
sprintf(tmp, "pfs%d:", pfsin);
if(mountedParty[pfsin][0]!=0)
fileXioUmount(tmp); mountedParty[pfsin][0]=0;
printf("%s mounting\n", inParty);
if(fileXioMount(tmp, inParty, FIO_MT_RDWR) < 0) return -1;
strcpy(mountedParty[pfsin], inParty);
}
in[3]=pfsin+'0';
}else
sprintf(in, "%s%s", inPath, file.name);
if(hddout){
if(pfsout<0){
if(pfsin==0) pfsout=1;
else pfsout=0;
sprintf(tmp, "pfs%d:", pfsout);
if(mountedParty[pfsout][0]!=0)
fileXioUmount(tmp); mountedParty[pfsout][0]=0;
if(fileXioMount(tmp, outParty, FIO_MT_RDWR) < 0) return -1;
printf("%s mounting\n", outParty);
strcpy(mountedParty[pfsout], outParty);
}
out[3]=pfsout+'0';
}else
sprintf(out, "%s%s", outPath, file.name);
// 僼僅儖僟偺応崌
if(file.attr & FIO_S_IFDIR){
// 僼僅儖僟嶌惉
ret = newdir(outPath, file.name);
if(ret == -17){
ret=-1;
if(title) ret=getGameTitle(outPath, &file, tmp);
if(ret<0) sprintf(tmp, "%s%s/", outPath, file.name);
strcat(tmp, "\nOverwrite?");
if(ynDialog(tmp)<0) return -1;
drawMsg("Pasting...");
} else if(ret < 0)
return -1;
// 僼僅儖僟偺拞恎傪慡僐僺乕
sprintf(out, "%s%s/", outPath, file.name);
sprintf(in, "%s%s/", inPath, file.name);
nfiles = getDir(in, files);
for(i=0; i<nfiles; i++)
if(copy(out, in, files[i], n+1) < 0) return -1;
return 0;
}
// 僼傽僀儖僒僀僘庢摼
if(hddin){
in_fd = fileXioOpen(in, O_RDONLY, fileMode);
if(in_fd<0) goto error;
size = fileXioLseek(in_fd,0,SEEK_END);
fileXioLseek(in_fd,0,SEEK_SET);
}else{
in_fd = fioOpen(in, O_RDONLY);
if(in_fd<0) goto error;
size = fioLseek(in_fd,0,SEEK_END);
fioLseek(in_fd,0,SEEK_SET);
}
// 儊儌儕偵堦搙偱撉傒崬傔傞僼傽僀儖僒僀僘偩偭偨応崌
buff = (char*)malloc(size);
if(buff==NULL){
buff = (char*)malloc(32768);
buffSize = 32768;
}else
buffSize = size;
while(size>0){
// 擖椡
if(hddin) buffSize = fileXioRead(in_fd, buff, buffSize);
else buffSize = fioRead(in_fd, buff, buffSize);
// 弌椡
if(hddout){
if(out_fd<0){
out_fd = fileXioOpen(out, O_RDONLY, fileMode);
if(out_fd >= 0){
fileXioClose(out_fd);
out_fd = -1;
if(fileXioRemove(out) < 0) goto error;
}
out_fd = fileXioOpen(out,O_WRONLY|O_TRUNC|O_CREAT,fileMode);
if(out_fd<0) goto error;
}
outsize = fileXioWrite(out_fd,buff,buffSize);
if(buffSize!=outsize){
fileXioClose(out_fd); out_fd=-1;
fileXioRemove(out);
goto error;
}
}else{
if(out_fd<0){
out_fd=fioOpen(out, O_WRONLY | O_TRUNC | O_CREAT);
if(out_fd<0) goto error;
}
outsize = fioWrite(out_fd,buff,buffSize);
if(buffSize!=outsize){
fioClose(out_fd); out_fd=-1;
mcSync(0,NULL,NULL);
mcDelete(out[2]-'0', 0, &out[4]);
mcSync(0, NULL, NULL);
goto error;
}
}
size -= buffSize;
}
ret=0;
error:
free(buff);
if(in_fd>0){
if(hddin) fileXioClose(in_fd);
else fioClose(in_fd);
}
if(in_fd>0){
if(hddout) fileXioClose(out_fd);
else fioClose(out_fd);
}
return ret;
}
////////////////////////////////////////////////////////////////////////
// 儁乕僗僩
int paste(const char *path)
{
char tmp[MAX_PATH];
int i, ret=-1;
if(!strcmp(path,clipPath)) return -1;
for(i=0; i<nclipFiles; i++){
strcpy(tmp, clipFiles[i].name);
if(clipFiles[i].attr & FIO_S_IFDIR) strcat(tmp,"/");
strcat(tmp, " pasting");
drawMsg(tmp);
ret=copy(path, clipPath, clipFiles[i], 0);
if(ret < 0) break;
if(cut){
ret=delete(clipPath, &clipFiles[i]);
if(ret<0) break;
}
}
if(mountedParty[0][0]!=0){
fileXioUmount("pfs0:"); mountedParty[0][0]=0;
}
if(mountedParty[1][0]!=0){
fileXioUmount("pfs1:"); mountedParty[1][0]=0;
}
return ret;
}
////////////////////////////////////////////////////////////////////////
// 僗僋儕乕儞僉乕儃乕僪
/*
仭 巊梡晄壜暥帤
: * " | < > \ / ?
仭 儗僀傾僂僩
A B C D E F G H I J K L M
N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m
n o p q r s t u v w x y z
0 1 2 3 4 5 6 7 8 9
( ) [ ] ! # $ % & @ ;
= + - ' ^ . , _
OK CANCEL
*/
int keyboard(char *out, int max)
{
const int KEY_W=276,
KEY_H=84,
KEY_X=130,
KEY_Y=60,
WFONTS=13,
HFONTS=7;
char *KEY="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 ()[]!#$%&@; =+-'^.,_ ";
int KEY_LEN;
int cur=0, sel=0, i, x, y, t=0;
char tmp[256], *p;
p=strrchr(out, '.');
if(p==NULL) cur=strlen(out);
else cur=(int)(p-out);
KEY_LEN = strlen(KEY);
while(1){
waitPadReady(0, 0);
if(readpad()){
if(new_pad & PAD_UP){
if(sel<=WFONTS*HFONTS){
if(sel>=WFONTS) sel-=WFONTS;
}else{
sel-=4;
}
}else if(new_pad & PAD_DOWN){
if(sel/WFONTS == HFONTS-1){
if(sel%WFONTS < 5) sel=WFONTS*HFONTS;
else sel=WFONTS*HFONTS+1;
}else if(sel/WFONTS <= HFONTS-2)
sel+=WFONTS;
}else if(new_pad & PAD_LEFT){
if(sel>0) sel--;
}else if(new_pad & PAD_RIGHT){
if(sel<=WFONTS*HFONTS) sel++;
}else if(new_pad & PAD_START){
sel = WFONTS*HFONTS;
}else if(new_pad & PAD_L1){
if(cur>0) cur--;
t=0;
}else if(new_pad & PAD_R1){
if(cur<strlen(out)) cur++;
t=0;
}else if(new_pad & PAD_CROSS){
if(cur>0){
strcpy(tmp, out);
out[cur-1]=0;
strcat(out, &tmp[cur]);
cur--;
t=0;
}
}else if(new_pad & PAD_CIRCLE){
i=strlen(out);
if(sel < WFONTS*HFONTS){
if(i<max && i<33){
strcpy(tmp, out);
out[cur]=KEY[sel];
out[cur+1]=0;
strcat(out, &tmp[cur]);
cur++;
t=0;
}
}else if(sel == WFONTS*HFONTS && i>0){
break;
}else
return -1;
}
}
// 昤夋奐巒
itoSprite(setting->color[0],
KEY_X-2,
KEY_Y-1,
KEY_X+KEY_W+3,
KEY_Y+KEY_H+2, 0);
drawFrame(
KEY_X,
KEY_Y,
KEY_X+KEY_W,
KEY_Y+KEY_H,setting->color[1]);
itoLine(setting->color[1], KEY_X, KEY_Y+11, 0,
setting->color[1], KEY_X+KEY_W, KEY_Y+11, 0);
printXY(out,
KEY_X+2+3,
KEY_Y+2,
setting->color[3], TRUE);
t++;
if(t<SCANRATE/2){
printXY("|",
KEY_X+cur*8+1,
KEY_Y+2,
setting->color[3], TRUE);
}else{
if(t==SCANRATE) t=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -