#1006: r.terraflow fails to stat() stream file on Windows ------------------------------+--------------------------------------------- Reporter: marisn | Owner: grass-dev@lists.osgeo.org Type: defect | Status: new Priority: critical | Milestone: 6.4.0 Component: Raster | Version: svn-releasebranch64 Resolution: | Keywords: wxgui, wingrass, terraflow Platform: MSWindows Vista | Cpu: x86-32 ------------------------------+--------------------------------------------- Comment (by glynn):
Replying to [comment:14 hamish]: > is stat() on Windows the same as it is on UNIX? Sort of. '''However''': if the file is open, it reports the size as zero bytes (or possibly the original size if the file was opened for update without truncation). Once the file is closed, it reports the correct size. Also, fstat() works correctly on open files. Test case: {{{ $ cat test.c #include <stdio.h> #include <sys/stat.h> int main(void) { char buf[1024]; struct stat st; FILE *fp; int i; fp = fopen("test.dat", "wb"); for (i = 0; i < 64; i++) fwrite(buf, 1, sizeof(buf), fp); fflush(fp); stat("test.dat", &st); printf("%d\n", (int)st.st_size); fstat(fileno(fp), &st); printf("%d\n", (int)st.st_size); fclose(fp); stat("test.dat", &st); printf("%d\n", (int)st.st_size); return 0; } $ gcc -Wall test.c $ ./a.exe 0 65536 65536 }}} A more portable way to determine the length of a file is to use fseek(SEEK_END), e.g.: {{{ long save = ftell(fp); fseek(fp, 0, SEEK_END); long size = ftell(fp); fseek(fp, save, SEEK_SET); return size; }}} -- Ticket URL: <http://trac.osgeo.org/grass/ticket/1006#comment:22> GRASS GIS <http://grass.osgeo.org>
_______________________________________________ grass-dev mailing list grass-dev@lists.osgeo.org http://lists.osgeo.org/mailman/listinfo/grass-dev