banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành Windows Hỏi thuật toán copy file  XML
  [Programming]   Hỏi thuật toán copy file 07/11/2007 07:17:21 (+0700) | #1 | 95809
[Avatar]
zThienLongz
Member

[Minus]    0    [Plus]
Joined: 29/08/2006 10:09:05
Messages: 104
Location: World
Offline
[Profile] [PM] [WWW]
Mình thấy trong Windows và linux đề có commands copy file. Tiện học về vào ra tệp mình định viết 1 đoạn mã để copy 1 file thanh nhìu file nhưng mà khổng thể nào viết nổi bạn nào giúp mình với.
Giả sử mình có 1 file gốc không biết nội dung bên trong nó là gì ,yêu cầu: bạn hãy tạo ra những file copy của file đó
Thanks.....
[Up] [Print Copy]
  [Question]   Hỏi thuật toán copy file 07/11/2007 08:33:11 (+0700) | #2 | 95829
FaL
Moderator

Joined: 14/04/2006 09:31:18
Messages: 1232
Offline
[Profile] [PM]

zThienLongz wrote:
Mình thấy trong Windows và linux đề có commands copy file. Tiện học về vào ra tệp mình định viết 1 đoạn mã để copy 1 file thanh nhìu file nhưng mà khổng thể nào viết nổi bạn nào giúp mình với.
Giả sử mình có 1 file gốc không biết nội dung bên trong nó là gì ,yêu cầu: bạn hãy tạo ra những file copy của file đó
Thanks..... 


Bồ thử copy từng byte của file đó xem!

FaL
Hãy giữ một trái tim nóng và một cái đầu lạnh
[Up] [Print Copy]
  [Question]   Hỏi thuật toán copy file 07/11/2007 13:04:29 (+0700) | #3 | 95902
[Avatar]
K4i
Moderator

Joined: 18/04/2006 09:32:13
Messages: 635
Location: Underground
Offline
[Profile] [PM]

FaL wrote:

zThienLongz wrote:
Mình thấy trong Windows và linux đề có commands copy file. Tiện học về vào ra tệp mình định viết 1 đoạn mã để copy 1 file thanh nhìu file nhưng mà khổng thể nào viết nổi bạn nào giúp mình với.
Giả sử mình có 1 file gốc không biết nội dung bên trong nó là gì ,yêu cầu: bạn hãy tạo ra những file copy của file đó
Thanks..... 


Bồ thử copy từng byte của file đó xem!

FaL 


Chính xác hơn là copy một khối byte có độ lớn xác định smilie vì làm việc với từng byte một trong bài toán này là không cần thiết
Sống là để không chết chứ không phải để trở thành anh hùng
[Up] [Print Copy]
  [Question]   Re: Hỏi thuật toán copy file 07/11/2007 13:33:11 (+0700) | #4 | 95909
TQN
Elite Member

[Minus]    0    [Plus]
Joined: 29/06/2006 22:28:01
Messages: 888
Location: Biết làm chi ?
Offline
[Profile] [PM] [WWW] [Yahoo!]
Cho cậu 3 đoạn code để copy file: dùng C RTL (có thể port qua Linux được), dùng hàm Windows API và dùng CopyFile Windows API:
Code:
// Code 1: dùng C RTL File IO functions
#include <stdio.h>
#include <errno.h>

#define BUF_SIZE 256

int main (int argc, char *argv [])
{
   FILE *in_file, *out_file;
   char rec [BUF_SIZE];
   size_t bytes_in, bytes_out;

   if (argc != 3) {
      printf ("Usage: cpC file1 file2\n");
      return 1;
   }

   in_file = fopen (argv [1], "rb");
   if (in_file == NULL) {
      perror (argv [1]);
      return 2;
   }

   out_file = fopen (argv [2], "wb");
   if (out_file == NULL) {
      perror (argv [2]);
      return 3;
   }

   /*   Process the input file a record at a time. */
   while ((bytes_in = fread (rec, 1, BUF_SIZE, in_file)) > 0) {
      bytes_out = fwrite (rec, 1, bytes_in, out_file);
      if (bytes_out != bytes_in) {
         perror ("Fatal write error.");
         return 4;
      }
   }

   fclose (in_file);
   fclose (out_file);

   return 0;
}

// Code 2: dùng Windows File IO API functions
#include <windows.h>
#include <stdio.h>

#define BUF_SIZE 256

int main (int argc, LPTSTR argv [])
{
   HANDLE hIn, hOut;
   DWORD nIn, nOut;
   CHAR Buffer [BUF_SIZE];

   if (argc != 3) {
      printf ("Usage: cpW file1 file2\n");
      return 1;
   }

   hIn = CreateFile (argv [1], GENERIC_READ, 0, NULL,
         OPEN_EXISTING, 0, NULL);
   if (hIn == INVALID_HANDLE_VALUE) {
      printf ("Cannot open input file. Error: %x\n",
             GetLastError ());
      return 2;
   }

   hOut = CreateFile (argv [2], GENERIC_WRITE, 0, NULL,
          CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
   if (hOut == INVALID_HANDLE_VALUE) {
      printf ("Cannot open output file. Error: %x\n",
             GetLastError ());
      return 3;
   }

   while (ReadFile (hIn, Buffer, BUF_SIZE, &nIn, NULL) && nIn > 0) {
      WriteFile (hOut, Buffer, nIn, &nOut, NULL);
      if (nIn != nOut) {
         printf ("Fatal write error: %x\n", GetLastError ());
         return 4;
      }
   }

   CloseHandle (hIn);
   CloseHandle (hOut);

   return 0;
}

// Code 3: Dùng Windows CopyFile API function
#include <windows.h>
#include <stdio.h>

int main (int argc, LPTSTR argv [])
{
   if (argc != 3) {
      printf ("Usage: cpCF file1 file2\n");
      return 1;
   }

   if (!CopyFile (argv [1], argv [2], FALSE)) {
      printf ("CopyFile Error: %x\n", GetLastError ());
      return 2;
   }

   return 0;
}

Nói trước là code trên không phải do tui viết à nhe, nó nằm trong 1 cuốn ebook trên máy tui.
[Up] [Print Copy]
  [Question]   Re: Hỏi thuật toán copy file 07/11/2007 14:51:55 (+0700) | #5 | 95927
FaL
Moderator

Joined: 14/04/2006 09:31:18
Messages: 1232
Offline
[Profile] [PM]

ThangCuEm wrote:
Cho cậu 3 đoạn code để copy file: dùng C RTL (có thể port qua Linux được), dùng hàm Windows API và dùng CopyFile Windows API:
Code:
// Code 1: dùng C RTL File IO functions
#include <stdio.h>
#include <errno.h>

#define BUF_SIZE 256


// Code 2: dùng Windows File IO API functions

// Code 3: Dùng Windows CopyFile API function

 


Em khoái đoạn code đầu tiên nhất, tuy nhiên em muốn hỏi thêm là vì sao define chính xác BUF_SIZE = 256? Ta hoàn tòan có thể define nó nhỏ hơn hoặc lớn hơn. Ở đây có gì cần lưu ý không anh?

FaL.
Hãy giữ một trái tim nóng và một cái đầu lạnh
[Up] [Print Copy]
  [Question]   Re: Hỏi thuật toán copy file 07/11/2007 23:06:55 (+0700) | #6 | 95957
[Avatar]
Look2Me
Member

[Minus]    0    [Plus]
Joined: 26/07/2006 23:30:57
Messages: 235
Location: Tủ quần nào
Offline
[Profile] [PM]

FaL wrote:

ThangCuEm wrote:
Cho cậu 3 đoạn code để copy file: dùng C RTL (có thể port qua Linux được), dùng hàm Windows API và dùng CopyFile Windows API:
Code:
// Code 1: dùng C RTL File IO functions
#include <stdio.h>
#include <errno.h>

#define BUF_SIZE 256


// Code 2: dùng Windows File IO API functions

// Code 3: Dùng Windows CopyFile API function

 


Em khoái đoạn code đầu tiên nhất, tuy nhiên em muốn hỏi thêm là vì sao define chính xác BUF_SIZE = 256? Ta hoàn tòan có thể define nó nhỏ hơn hoặc lớn hơn. Ở đây có gì cần lưu ý không anh?

FaL. 


theo mình kích thước 4Kb là hợp lý.
[Up] [Print Copy]
  [Question]   Re: Hỏi thuật toán copy file 07/11/2007 23:12:11 (+0700) | #7 | 95959
TQN
Elite Member

[Minus]    0    [Plus]
Joined: 29/06/2006 22:28:01
Messages: 888
Location: Biết làm chi ?
Offline
[Profile] [PM] [WWW] [Yahoo!]
Bao nhiêu cũng được, nhưng nên là bội của của DWORD size (4, 8). Tui thường code = 4096 = pagesize = 8 * sector size.
Còn rất nhiều cách, vd dùng hàm Shell API, dùng Memory Mapping File API để tăng tốc độ.
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|