Copying a file and reading size I get always zero.


 
Thread Tools Search this Thread
Top Forums Programming Copying a file and reading size I get always zero.
# 1  
Old 11-10-2016
Copying a file and reading size I get always zero.

I need to copy a file (srcFile) to a new ubication (destFile). Then I calculate the size of the copy file using stat. The problem is that I always get a cero size value although the file has not cero size in the hard disk.

The source code that does this is :

PROGRAM 1:

Code:
  char srcFile[MAX_FILE_SIZE];
  char destFile[MAX_FILE_SIZE];
  int fileDest = 0;

  strcpy(srcFile, "/dir1/file1.bin");
  strcpy(destFile, "/dir2/newfile1.bin");

  int rf = 255;
         
  if (rf = rename(srcFile, destFile)) 
  {
    // Process error
  }

  struct stat dest_info;
  int sr = stat(destFile, &dest_info);
        
  printf("New file size is %d", dest_info.st_size);

Please, can you help me to solve this issue? Thanks in advance.

Last edited by Scrutinizer; 11-10-2016 at 08:37 PM.. Reason: code tags
# 2  
Old 11-11-2016
Why don't you show us the whole source file? And, it wouldn't hurt to tell us what language you're using (one might assume it is C, but with all of the missing pieces needed for a valid C program, that is just a seemingly reasonable guess). And, show us what diagnostics were printed when you tried to compile your source code.

With what you have shown us there are lots of undefined values and undeclared functions without even considering that there is no main() function in your code.

Having code that says // Process error to handle errors, is a great way to ignore errors and have absolutely no idea whether or not anything worked. I would suggest that you actually put code in that section to issue a diagnostic if the rename() failed. And add checks to verify that the strcpy() and stat() calls also worked or print diagnostics and exit if any of them failed.

One might also note that you said your code is intended to copy of file. It does not copy a file. It attempts to move a file (removing the source file if the rename() succeeds); not copy it.
# 3  
Old 11-11-2016
As Don says, it's not possible to determine what this code is actually doing. However, it occurs to me that, it could be simply creating a link (and leaving the original file in-situ). If you then stat the link (inode) location you will likely get a zero length. However, when you list that link it will show the original file size.

However, please answer Don's questions and post what OS you are using.

Last edited by hicksd8; 11-11-2016 at 07:40 AM..
# 4  
Old 11-11-2016
Quote:
Originally Posted by hicksd8
As Don says, it's not possible to determine what this code is actually doing. However, it occurs to me that, it could be simply creating a link (and leaving the original file in-situ). If you then stat the link (inode) location you will likely get a zero length. However, when you list that link it will show the original file size.

However, please answer Don's questions and post what OS you are using.
Hi hicksd8,
Assuming that there is no power failure, disk failure, disk controller failure, CPU failure, memory failure, etc. between the time of the creation of the new link and the removal of the old link; the old link will be removed if a new link was created as a result of a rename() request. If the original file size was greater than zero, you should never end up a with a zero size original file and a non-zero new file size as a result of just a rename() request.

My guess would be that one of the following happened:
  1. /dir1/file1.bin and /dir2/newfile1.bin reside on different filesystems, the rename() is failing with an EXDEV error, the stat() is failing because the new link was not created, and the zero size is coming from uninitialized data on the stack in the struct stat;
  2. there is an existing /dir2/newfile1.bin that has size zero that the user invoking this program doesn't have permission to remove (getting an EPERM error from the rename()) and the code falls through the rename() failure and gets and prints the size of the unmodified destination file; or
  3. everything went as expected creating a new link, the stat() succeeded, and the printf("New file size is %d", dest_info.st_size); successfully printed the high order bits of an object of type size_t (which is a 64-bit type on most current systems) using %d (which prints a 32-bit integer on most current systems).
But, lots of other problems are also possible with missing #include directives, unknown compiler diagnostics and warnings while the code was being built, etc. and we have absolutely no way to determine what happened with the information we have been given to analyze.
This User Gave Thanks to Don Cragun For This Post:
# 5  
Old 11-11-2016
Hi Don,

Yep, we're all trying to guess what's happening here and none of us have enough information to know exactly.

The OP says it's a copy operation which infers that the OP expects the source to still exist after the operation. However, 'rename' is in the code.

I was attempting to explain the OP comment that his code outputs a zero length for the destination but when he lists the file it's the correct size. Given that detail I suggested that the destination was in fact a link and not a copy, and that somehow, the process fails before the inode was populated with the allocated sectors of the file. So the destination shows length zero but the source (which the OP expects to still exist) shows the correct size.

I 'guess' that we can't 'guess' any more without more info. Really sorry that I tried only to confuse the conversation.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Reading and copying a selected rows

Dear All, I have a data file input.res like below. (Only six column shown here for example.) Sequence of first column starting from 1 to 148. Input file 1 Q0 9_August_2014_Entertainment2 0 20.14967806339729 BM25b1.0 1 Q0 13_October_2012_Page323 1 20.134224346765738 BM25b1.0 1 Q0... (2 Replies)
Discussion started by: imranrasheedamu
2 Replies

2. UNIX for Dummies Questions & Answers

Ls directory size reporting byte size instead of file count

I have been searching both on Unix.com and Google and have not been able to find the answer to my question. I think it is partly because I can't come up with the right search terms. Recently, my virtual server switched storage devices and I think the problem may be related to that change.... (2 Replies)
Discussion started by: jmgibby
2 Replies

3. Programming

[c] How to calculate size of the file from size of the buffer?

Hi, Can I find size of the file from size of the buffer written? nbECRITS = fwrite(strstr(data->buffer, ";") + 1, sizeof(char), (data->buffsize) - LEN_NOM_FIC, fic_sortie); Thank You :) (1 Reply)
Discussion started by: ezee
1 Replies

4. Shell Programming and Scripting

Script to read file size and send email only if size > 0.

Hi Experts, I have a script like $ORACLE_HOME/bin/sqlplus username/password # << ENDSQL set pagesize 0 trim on feedback off verify off echo off newp none timing off set serveroutput on set heading off spool Schemaerrtmp.txt select ' TIMESTAMP COMPUTER NAME ... (5 Replies)
Discussion started by: welldone
5 Replies

5. Shell Programming and Scripting

The scripts not able to make the file to size 0, every times it go back to its original size

#!/bin/sh ########################################################################################################## #This script is being used for AOK application for cleaning up the .out files and zip it under logs directory. # IBM # Created #For pdocap201/pdoca202 .out files for AOK #1.... (0 Replies)
Discussion started by: mridul10_crj
0 Replies

6. Solaris

Directory size larger than file system size?

Hi, We currently have an Oracle database running and it is creating lots of processes in the /proc directory that are 1000M in size. The size of the /proc directory is now reading 26T. How can this be if the root file system is only 13GB? I have seen this before we an Oracle temp file... (6 Replies)
Discussion started by: sparcman
6 Replies

7. Programming

Reading a whole line without betting on size

i have been googling, and came to the conclusion that there is not standard C library (or commonly used) that reads a complete line of a file, without a size parameter being involved. so, as a little exercise i decided to think it over, and make my own i came up with an idea, and wanted to... (2 Replies)
Discussion started by: broli
2 Replies

8. Shell Programming and Scripting

URGENT HELP NEEDED ON -File size reading

All Expert, I am using Sun OS 5.8 and Perl version 5 in One server and Perl 5.8 in another unix server. I am able to read a file using fopen function of perl --file size having more then 3 GB of data.(In the machine where Perl 5.8 install) But when i am running the same perl script --It... (1 Reply)
Discussion started by: jambesh
1 Replies

9. Solaris

command to find out total size of a specific file size (spread over the server)

hi all, in my server there are some specific application files which are spread through out the server... these are spread in folders..sub-folders..chid folders... please help me, how can i find the total size of these specific files in the server... (3 Replies)
Discussion started by: abhinov
3 Replies

10. Filesystems, Disks and Memory

Strange difference in file size when copying LARGE file..

Hi, Im trying to take a database backup. one of the files is 26 GB. I am using cp -pr to create a backup copy of the database. after the copying is complete, if i do du -hrs on the folders i saw a difference of 2GB. The weird fact is that the BACKUP folder was 2 GB more than the original one! ... (1 Reply)
Discussion started by: 0ktalmagik
1 Replies
Login or Register to Ask a Question