- 论坛徽章:
- 0
|
代码完成
在大家的帮助下,完成了代码。 
现在拿出来让大家看一下,希望多提宝贵意见。
- #include "ourhdr.h"
- #include <assert.h>
- #define MAXLEN 1024
- int file_cnt;
- static int
- gen_file_list(char *path, char *recname)
- {
- char cmdstr[MAXLEN] = {0};
- char fname[MAXLEN] = {0};
- char abs_fname[MAXLEN] = {0};
- char buffer[MAXLEN] = {0};
- char del_fname_unsort[MAXLEN] = {0};
- unsigned long fsize = 0;
- FILE *fp = NULL, *fpdel = NULL;
-
- assert( path && recname );
-
- memset(cmdstr, 0, 256);
- sprintf(cmdstr, "ls -1str %s | grep _%s_ > /tmp/file_list_tmp.txt", path, recname);
- system(cmdstr);
- sprintf(del_fname_unsort, "/tmp/tmp_delete_%s_unsort", recname);
-
- if( (fp=fopen("/tmp/file_list_tmp.txt", "r")) == NULL ){
- printf("Error: fail to open the file_list_tmp.txt\n");
- return -1;
- }
-
- if( (fpdel=fopen(del_fname_unsort, "a+")) == NULL ){
- printf("Error: fail to open the %s\n", del_fname_unsort);
- return -2;
- }
-
- while( !feof(fp) ) {
- memset(buffer, 0, MAXLEN);
- memset(fname, 0, MAXLEN);
- memset(abs_fname, 0, MAXLEN);
- fsize = 0;
- fgets(buffer, MAXLEN, fp);
- if( !strcmp(buffer, "") ) break;
- if( sscanf(buffer, "%ld %s", &fsize, fname) != 2 ){
- printf("Error: sscanf().\n");
- continue;
- }
- sprintf(abs_fname, "%s/%s", path, fname);
- fprintf(fpdel, "%ld %s\n", fsize, abs_fname);
- file_cnt++;
- }
-
- fcloseall();
- remove("/tmp/file_list_tmp.txt");
- return 0;
- }
- /* swap: interchange v[i] and v[j] */
- void
- swap(char *v[], int i, int j)
- {
- char *temp;
-
- temp = v[i];
- v[i] = v[j];
- v[j] = temp;
- //printf("v[i]: %s\n", v[i]);
- //printf("v[j]: %s\n", v[j]);
- }
- /* compare: return <0 if s<t, 0 if s==t, >0 if s>t */
- //4844 /mnt/USB1/C:/folderA/axis-test/AXIS207_axis-test_2007-03-09Time16.22.17~2007-03-09Time16.23.10.avi
- //2068 /mnt/USB1/C:/folderA/axis-test/AXIS207_axis-test_2007-03-12Time11.24.28~2007-03-12Time11.24.50.avi
- int
- compare(char *s, char *t)
- {
- char *ps=NULL, *pt=NULL;
-
- ps = strrchr(s, '_');
- pt = strrchr(t, '_');
- for ( ; *ps == *pt; ps++, pt++)
- if (*ps == '\0') return 0;
-
- return *ps - *pt;
- }
- /* qsort_str: sort v[left]...v[right] into increasing order */
- void
- qsort_str(char *v[], int left, int right)
- {
- static count = 0;
- int i, last;
- if (left >= right) /* do nothing if array contains */
- return; /* fewer than two elements */
-
- swap(v, left, (left + right)/2);
- last = left;
- for (i = left+1; i <= right; i++){
- if (compare(v[i], v[left]) < 0) swap(v, ++last, i);
- }
- swap(v, left, last);
- qsort_str(v, left, last-1);
- qsort_str(v, last+1, right);
- }
- static int
- sort_file_content(char *unsort_file_name, char *recname)
- {
- char *fname[MAXLEN];
- char buffer[MAXLEN] = {0};
- char del_fname[MAXLEN] = {0};
- int idx = 0;
- unsigned long fsize = 0;
- FILE *fp_unsort = NULL, *fp_sort = NULL;
- assert(unsort_file_name && recname);
-
- if( (fp_unsort=fopen(unsort_file_name, "a+")) == NULL ){
- printf("Error: fail to open the %s\n", unsort_file_name);
- return -1;
- }
-
- while( !feof(fp_unsort) && idx<file_cnt ) {
- memset(buffer, 0, MAXLEN);
- fname[idx] = (char *)malloc(sizeof(char)*MAXLEN);
- fsize = 0;
- fgets(fname[idx++], MAXLEN, fp_unsort);
- }
-
- qsort_str(fname, 0, file_cnt-1);
-
- sprintf(del_fname, "/tmp/tmp_delete_%s", recname);
- if( (fp_sort=fopen(del_fname, "w")) == NULL ){
- printf("Error: fail to open the %s\n", unsort_file_name);
- return -1;
- }
- for(idx = 0; idx < file_cnt; idx++){
- fprintf(fp_sort, "%s", fname[idx]);
- free(fname[idx]);
- }
-
- fcloseall();
- remove(unsort_file_name);
- return 0;
- }
- int main(int argc, char *argv[])
- {
- int loop;
- char unsort_file_name[MAXLEN] = {0};
-
- sprintf(unsort_file_name, "/tmp/tmp_delete_%s_unsort", "axis-test");
-
- /* for 循环之后生成的样本文件见附件 tmp_delete_axis-test_unsort */
- /* 主函数返回后生成的样本文件见附件 tmp_delete_axis-test */
- for(loop = 1; loop < argc; loop++){
- gen_file_list(argv[loop], "axis-test");
- }
- printf(">:file_cnt is: %d\n", file_cnt);
-
- sort_file_content(unsort_file_name, "axis-test");
- return 0;
- }
- /*
- Call example:
- # ./fileContentSort /mnt/USB1/C:/folderA/axis-test /mnt/USB1/C:/folderB/axis-test
- */
复制代码
[ 本帖最后由 daworld 于 2007-3-12 22:08 编辑 ] |
|