自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

將源目錄中的文件按照前綴分發(fā)到不同目錄中的算法設計及C代碼實現(xiàn)

開發(fā) 開發(fā)工具 算法
在Linux系統(tǒng)的某個源目錄中有一批后綴相同的文件,編寫程序將這些文件按照前綴分發(fā)到不同的目錄中。

一、需求描述

在Linux系統(tǒng)的某個源目錄中有一批后綴相同的文件,編寫程序將這些文件按照前綴分發(fā)到不同的目錄中。

例如,源目錄SourceDir中存放有三個后綴相同的文件File1_1.txt、File2_1.txt和File3_1.txt,按照前綴File1_、File2_和File3_將它們分別移動(分發(fā))到目錄FileDir1、FileDir2和FileDir3中。

二、算法設計

基于需求,可以采用如圖1所示的程序流程:

圖1 程序總體流程

三、特殊流程考慮

在編寫程序的過程中,對于某些特殊流程的考慮如下:

1.如果掃描源目錄出錯,則直接停止程序的運行,而不用繼續(xù)掃描下一個目錄。

2.對于某些空文件(即文件的大小為0),直接在源目錄中將其刪除,而不用進行分發(fā)。

3.為了隨時能夠處理放到源目錄中的文件,程序每隔一段時間(如一分鐘)掃描一次源目錄。也就是說,如果不人為操作,程序啟動之后會不停地運行。

四、程序代碼

  1. /********************************************************************** 
  2. * 版權所有 (C)2016, Zhou Zhaoxiong。 
  3. * 文件名稱:FileDistribute.c 
  4. * 文件標識:無 
  5. * 內容摘要:將某個目錄中的文件按照前綴分發(fā)到對應的目錄中 
  6. * 其它說明:無 
  7. * 當前版本:V1.0 
  8. * 作    者:Zhou Zhaoxiong 
  9. * 完成日期:20160517 
  10. **********************************************************************/ 
  11. #include <stdio.h> 
  12. #include <string.h> 
  13. #include <dirent.h> 
  14. #include <ftw.h> 
  15. #include <time.h> 
  16.  
  17. // 重定義數(shù)據(jù)類型 
  18. typedef signed   int        INT32; 
  19. typedef unsigned int        UINT32; 
  20. typedef unsigned char       UINT8; 
  21.  
  22. // 全局變量定義 
  23. UINT8  g_szSourceDir[256] = {0};     // 源文件的目錄 
  24.  
  25. // 函數(shù)聲明 
  26. INT32 SelectFlies(struct dirent *pDir); 
  27. void ScanDirAndDistribute(void); 
  28. void Sleep(UINT32 iCountMs); 
  29.  
  30.  
  31. /**************************************************************** 
  32. * 功能描述: 主函數(shù) 
  33. * 輸入?yún)?shù): 無 
  34. * 輸出參數(shù): 無 
  35. * 返 回 值: 0-執(zhí)行完成 
  36. * 其他說明: 無 
  37. * 修改日期       版本號        修改人        修改內容 
  38. ------------------------------------------------------------- 
  39. * 20160517        V1.0     Zhou Zhaoxiong     創(chuàng)建 
  40. ****************************************************************/ 
  41. INT32 main(void) 
  42.     // 源文件的目錄 
  43.     snprintf(g_szSourceDir, sizeof(g_szSourceDir)-1, "%s/zhouzx/TestDir/SourceDir", getenv("HOME")); 
  44.  
  45.     // 調用函數(shù)執(zhí)行文件的分發(fā) 
  46.     while (1) 
  47.     { 
  48.         ScanDirAndDistribute(); 
  49.  
  50.         Sleep(60 * 1000);    // 每一分鐘執(zhí)行一次文件的分發(fā) 
  51.     } 
  52.  
  53.     return 0; 
  54.  
  55.  
  56. /********************************************************************** 
  57. * 功能描述:根據(jù)后綴選擇文件 
  58. * 輸入?yún)?shù):dir-目錄 
  59. * 輸出參數(shù):無 
  60. * 返 回 值:0-失敗   1-成功 
  61. * 其它說明:一個形如test.txt的文件要被掃描出來, 而形如test的文件不符合條件 
  62. * 修改日期         版本號      修改人          修改內容 
  63. -------------------------------------------------------------------- 
  64. * 20160517         V1.0    ZhouZhaoxiong        創(chuàng)建 
  65. ***********************************************************************/ 
  66. INT32 SelectFlies(struct dirent *pDir) 
  67.     if (pDir == NULL
  68.     { 
  69.         printf("SelectFlies:input parameter is NULL!\n"); 
  70.         return 0; 
  71.     } 
  72.  
  73.     // 根據(jù).txt(后綴)選擇文件 
  74.     if (strstr(pDir->d_name, ".txt") != NULL
  75.     { 
  76.         return 1;         // 找到了滿足條件的文件 
  77.     } 
  78.     else 
  79.     { 
  80.         return 0; 
  81.     } 
  82.  
  83.  
  84. /********************************************************************** 
  85. * 功能描述:掃描目錄并分發(fā)文件 
  86. * 輸入?yún)?shù):無 
  87. * 輸出參數(shù):無 
  88. * 返 回 值:無 
  89. * 其它說明:無 
  90. * 修改日期         版本號      修改人          修改內容 
  91. -------------------------------------------------------------------- 
  92. * 20160517         V1.0    ZhouZhaoxiong        創(chuàng)建 
  93. ***********************************************************************/ 
  94. void ScanDirAndDistribute(void) 
  95.     INT32  iScanDirRet           = 0; 
  96.     UINT32 iFileIdx              = 0; 
  97.     UINT32 iFileCount            = 0; 
  98.     UINT32 iFileSize             = 0; 
  99.     UINT8  szFileDir[256]        = {0}; 
  100.     UINT8  szScanedFile[512]     = {0}; 
  101.     UINT8  szCmdBuf[256]         = {0}; 
  102.     FILE  *fp                    = NULL
  103.     struct dirent **ppDirEnt     = NULL
  104.  
  105.     // 掃描源目錄, 并分發(fā)文件 
  106.     iScanDirRet = scandir(g_szSourceDir, &ppDirEnt, SelectFlies, alphasort); 
  107.     if (iScanDirRet < 0)   // 掃描目錄出錯 
  108.     { 
  109.         printf("ScanDirAndDistribute:exec scandir failed, path=%s\n", g_szSourceDir); 
  110.         return
  111.     } 
  112.     else if (iScanDirRet == 0)   // 目錄下無文件 
  113.     { 
  114.         printf("ScanDirAndDistribute:no satisfied file in directory %s\n", g_szSourceDir); 
  115.     } 
  116.     else          // 將滿足條件的文件移動到對應的目錄中 
  117.     { 
  118.         for (iFileIdx = 0; iFileIdx < iScanDirRet; iFileIdx ++) 
  119.         { 
  120.             // 先判斷掃描到的文件是否為空文件, 是則直接刪除, 不是才執(zhí)行移動的操作 
  121.             memset(szScanedFile, 0x00, sizeof(szScanedFile)); 
  122.             snprintf(szScanedFile, sizeof(szScanedFile) - 1, "%s/%s", g_szSourceDir, ppDirEnt[iFileIdx]->d_name); 
  123.             fp = fopen(szScanedFile, "r"); 
  124.             if (fp == NULL)          // 打開文件失敗, 直接返回 
  125.             { 
  126.                 printf("ScanDirAndDistribute:open file %s failed, please check!\n", szScanedFile); 
  127.                 return
  128.             } 
  129.             fseek(fp, 0, SEEK_END); 
  130.             iFileSize = ftell(fp); 
  131.             if (iFileSize == 0)     // 該文件為空文件 
  132.             { 
  133.                 printf("ScanDirAndDistribute:%s is an empty file, so delete it directly!\n", szScanedFile); 
  134.                 memset(szCmdBuf, 0x00, sizeof(szCmdBuf)); 
  135.                 snprintf(szCmdBuf, sizeof(szCmdBuf) - 1, "rm %s", szScanedFile); 
  136.                 system(szCmdBuf); 
  137.             } 
  138.             else   // 根據(jù)前綴將文件移動(分發(fā))到對應的目錄中 
  139.             { 
  140.                 if (strncmp(ppDirEnt[iFileIdx]->d_name, "File1_", strlen("File1_")) == 0)    // 移動到FileDir1 
  141.                 { 
  142.                     memset(szFileDir, 0x00, sizeof(szFileDir)); 
  143.                     snprintf(szFileDir, sizeof(szFileDir)-1, "%s/zhouzx/TestDir/FileDir1", getenv("HOME")); 
  144.                 } 
  145.                 else if (strncmp(ppDirEnt[iFileIdx]->d_name, "File2_", strlen("File2_")) == 0)    // 移動到FileDir2 
  146.                 { 
  147.                     memset(szFileDir, 0x00, sizeof(szFileDir)); 
  148.                     snprintf(szFileDir, sizeof(szFileDir)-1, "%s/zhouzx/TestDir/FileDir2", getenv("HOME")); 
  149.                 } 
  150.                 else if (strncmp(ppDirEnt[iFileIdx]->d_name, "File3_", strlen("File3_")) == 0)    // 移動到FileDir3 
  151.                 { 
  152.                     memset(szFileDir, 0x00, sizeof(szFileDir)); 
  153.                     snprintf(szFileDir, sizeof(szFileDir)-1, "%s/zhouzx/TestDir/FileDir3", getenv("HOME")); 
  154.                 } 
  155.                 else    // 前綴不滿足, 直接將該文件刪掉 
  156.                 { 
  157.                     memset(szCmdBuf, 0x00, sizeof(szCmdBuf)); 
  158.                     snprintf(szCmdBuf, sizeof(szCmdBuf) - 1, "rm %s", szScanedFile); 
  159.                     system(szCmdBuf); 
  160.  
  161.                     printf("ScanDirAndDistribute:now, %s\n", szCmdBuf); 
  162.  
  163.                     continue;  // 繼續(xù)判斷下一個 
  164.                 } 
  165.  
  166.                 memset(szCmdBuf, 0x00, sizeof(szCmdBuf)); 
  167.                 snprintf(szCmdBuf, sizeof(szCmdBuf) - 1, "mv %s %s", szScanedFile, szFileDir); 
  168.                 system(szCmdBuf); 
  169.  
  170.                 printf("ScanDirAndDistribute:now, %s\n", szCmdBuf); 
  171.  
  172.                 iFileCount ++; 
  173.             } 
  174.         } 
  175.     } 
  176.  
  177.     printf("ScanDirAndDistribute:this time,totally moved %d file(s).\n", iFileCount); 
  178.  
  179.     return
  180.  
  181.  
  182. /********************************************************************** 
  183. * 功能描述: 程序休眠 
  184. * 輸入?yún)?shù): iCountMs-休眠時間(單位:ms) 
  185. * 輸出參數(shù): 無 
  186. * 返 回 值: 無 
  187. * 其它說明: 無 
  188. * 修改日期      版本號       修改人        修改內容 
  189. ------------------------------------------------------------------ 
  190. * 20160517       V1.0     Zhou Zhaoxiong     創(chuàng)建 
  191. ********************************************************************/  
  192. void Sleep(UINT32 iCountMs) 
  193.     struct timeval t_timeout = {0}; 
  194.  
  195.     if (iCountMs < 1000) 
  196.     { 
  197.         t_timeout.tv_sec  = 0; 
  198.         t_timeout.tv_usec = iCountMs * 1000; 
  199.     } 
  200.     else 
  201.     { 
  202.         t_timeout.tv_sec  = iCountMs / 1000; 
  203.         t_timeout.tv_usec = (iCountMs % 1000) * 1000; 
  204.     } 
  205.     select(0, NULLNULLNULL, &t_timeout);    // 調用select函數(shù)阻塞程序 
  206.  

五、程序測試

將編寫好的程序“FileDistribute.c”上傳到Linux機器,并使用“gcc -g -o FileDistribute FileDistribute.c”命令對該程序進行編譯,生成“FileDistribute”文件。下面對程序進行詳細的測試。

1.在啟動程序之前,在源目錄SourceDir中放入文件File1_1.txt、File2_1.txt和File3_1.txt,程序運行情況如下:

  1. ScanDirAndDistribute:now, mv /home/zhou/zhouzx/TestDir/SourceDir/File1_1.txt /home/zhou/zhouzx/TestDir/FileDir1 
  2. ScanDirAndDistribute:now, mv /home/zhou/zhouzx/TestDir/SourceDir/File2_1.txt /home/zhou/zhouzx/TestDir/FileDir2 
  3. ScanDirAndDistribute:now, mv /home/zhou/zhouzx/TestDir/SourceDir/File3_1.txt /home/zhou/zhouzx/TestDir/FileDir3 
  4. ScanDirAndDistribute:this time,totally moved 3 file(s). 

可以看到,源目錄中的三個文件已經(jīng)沒有了,它們被分別移動到了結果目錄FileDir1、FileDir2和FileDir3中:

  1. ~/zhouzx/TestDir/SourceDir> ll 
  2. total 0 
  3.  
  4. ~/zhouzx/TestDir/FileDir1> ll 
  5. -rw-------  1 zhou users 12 2016-05-17 18:58 File1_1.txt 
  6.  
  7. ~/zhouzx/TestDir/FileDir2> ll 
  8. -rw-------  1 zhou users 12 2016-05-17 18:58 File2_1.txt 
  9.  
  10. ~/zhouzx/TestDir/FileDir3> ll 
  11. -rw-------  1 zhou users 12 2016-05-17 18:58 File3_1.txt 

2.一段時間之后,在源目錄SourceDir中放入文件File4_1.txt,程序運行情況如下:

  1. ScanDirAndDistribute:now, rm /home/zhou/zhouzx/TestDir/SourceDir/File4_1.txt 
  2. ScanDirAndDistribute:this time,totally moved 0 file(s).1212 

可以看到,因為前綴不匹配,F(xiàn)ile4_1.txt文件直接被刪除掉了。

  1. ~/zhouzx/TestDir/SourceDir> ll  
  2. total 01212 

3.一段時間之后,在源目錄SourceDir中放入空文件File_7.txt、File_8.txt和File_9.txt,程序運行情況如下:

  1. ScanDirAndDistribute:/home/zhou/zhouzx/TestDir/SourceDir/File_7.txt is an empty file, so delete it directly! 
  2. ScanDirAndDistribute:/home/zhou/zhouzx/TestDir/SourceDir/File_8.txt is an empty file, so delete it directly! 
  3. ScanDirAndDistribute:/home/zhou/zhouzx/TestDir/SourceDir/File_9.txt is an empty file, so delete it directly! 
  4. ScanDirAndDistribute:this time,totally moved 0 file(s). 

可以看到,源目錄SourceDir中的空文件已經(jīng)被全部刪除掉了。

  1. ~/zhouzx/TestDir/SourceDir> ll  
  2. total 01212 

六、需求擴展

基于本文中的需求和程序,可考慮對需求進行以下擴展:

1.在移動(分發(fā))文件之前,先查看相同文件名的文件在對應結果目錄中是否存在,如果存在,則直接將該文件在源目錄中刪除掉;如果不存在,才將該文件移動到對應結果目錄中。

2.為避免結果目錄中的文件過多,可以在程序中添加清理機制,即將存放時間超過一定時長的文件刪除掉。

3.為了體現(xiàn)程序的靈活性,可將部分文件信息(如文件前綴、后綴、存放目錄、掃描間隔時長等)存放到配置文件中,程序在啟動時讀取相關的配置項的值來執(zhí)行后續(xù)目錄掃描和文件分發(fā)的操作。

【本文是51CTO專欄作者周兆熊的原創(chuàng)文章,作者微信公眾號:周氏邏輯(logiczhou)】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: csdn博客
相關推薦

2016-12-29 11:18:26

前綴后綴C代碼

2022-09-26 00:21:03

Spring文件項目

2023-05-16 14:45:42

應用開發(fā)鴻蒙

2016-12-29 16:25:32

字符串算法代碼

2016-12-30 13:37:50

字符串算法代碼

2023-03-15 10:34:47

Linux文件數(shù)

2009-09-28 10:28:04

Linux刪除目錄子目錄

2016-12-29 17:14:41

回文串算法代碼

2017-05-22 16:32:53

AndroidFrameworkManifest

2010-03-16 14:15:37

Linux系統(tǒng)

2021-03-16 12:42:42

FreeDOS開源

2011-03-18 10:27:00

SQL Server目錄索引

2017-09-22 15:03:08

Python遺傳算法GAFT框架

2020-11-11 07:48:21

Node

2012-12-28 14:28:26

Android開發(fā)

2016-12-30 13:32:24

字符串算法代碼

2011-04-06 15:34:45

活動目錄

2011-07-15 10:20:34

活動目錄

2016-12-20 09:47:17

Linux命令復制文件到多個目錄

2009-08-17 07:58:00

C#刪除文件目錄
點贊
收藏

51CTO技術棧公眾號