接受通配符以打开文件

时间:2011-10-07 12:23:40

标签: c file wildcard

好的,这是令人尴尬的,尽管我讨厌,但我别无选择。我不知道C,但我遇到了一个我需要解决的问题,虽然我已经做了一些研究,但是我需要自己修改程序的时间太多,所以我不得不吞下自己的骄傲(和我猜一些代表要求帮助。

这是一个将unix文件转换为dos的简单程序,唯一的问题是我需要它来接受通配符(例如.. c:/&gt; unix2dos * .txt或file * .txt)没什么特别的。< / p>

这是我现在的代码..

    // UNIX2DOS - a Win32 utility to convert single text files from Unix to MS-DOS format.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <io.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/utime.h>

#ifndef TRUE
#   define TRUE  (1)
#   define FALSE (0)
#endif

#define R_CNTRL   "rb"
#define W_CNTRL   "wb"

struct stat s_buf;

int u2dos (path)
char *path;
{
    FILE *in, *out;
    int ch,
        prev_ch= 0, 
        rval = FALSE;
    char temppath [16];
    struct _utimbuf ut_buf;
    strcpy (temppath, "./clntmp");
    strcat (temppath, "XXXXXX");
    mktemp (temppath);
    if ((in=fopen (path, R_CNTRL)) == (FILE *) 0)
        return TRUE;
    if ((out=fopen (temppath, W_CNTRL)) == (FILE *) 0)
    {
        fclose (in);
        return TRUE;
    }

    #define LF        0x0A
    #define CR        0x0D

    while ((ch = getc (in)) != EOF)
    {
        if (    ( ch == LF)
             && ( prev_ch != CR)
             && ( putc( CR, out) == EOF)
             || ( putc( ch, out) == EOF)
           )
        {
            rval = TRUE;
            break;
        }
        prev_ch= ch ;
    }

    if (fclose (in) == EOF)
    {
        rval = TRUE;
    }
    if (fclose (out) == EOF)
    {
        rval = TRUE;
    }
    ut_buf.actime = s_buf.st_atime;
    ut_buf.modtime = s_buf.st_mtime;
    if (_utime (temppath, &ut_buf) == -1)
        rval = TRUE;
    if (unlink (path) == -1)
        rval = TRUE;
    if (rval)
    {
        unlink (temppath);
        return TRUE;
    }
    if (rename (temppath,path) == -1)
    {
        fprintf (stderr, "Unix2Dos: Problems renaming '%s' to '%s'.\n", temppath, path);
        fprintf (stderr, "          However, file '%s' remains.\n", temppath);
        exit (1);
    }
    unlink (temppath);
    return FALSE;
}

void main (argc, argv)
int argc;
char **argv;
{
    char *path;
    while (--argc>0)
    {
        if (stat (path=*++argv, &s_buf) != -1)
        {
            printf ("Unix2Dos: Processing file %s ...\n", path);
            if (u2dos (path))
            {
                fprintf (stderr, "Unix2Dos: Problems processing file %s.\n", path);
                exit (1);
            }
        }
        else
        {
            fprintf (stderr, "Unix2Dos: Can't stat '%s'.\n", path);
            exit (1);
        }
    }
}

我不敢相信我已经偏离了一个“发送给我代码”的人,我已经开始鄙视了,但现在看来这似乎是我最好的选择。

我现在要把头埋在沙子里。谢谢你的时间。

编辑

虽然暗示,我认为我应该明白这个问题。在Windows环境中修改此程序以接受通配符变量可以提供一些帮助吗?

4 个答案:

答案 0 :(得分:4)

* nix shells(例如bash)会自动扩展通配符参数。 Windows shell没有。但Microsoft Visual C运行时库确实可以选择在程序启动时自动执行此操作。如何做到解释here。基本上你需要链接到setargv.obj。

答案 1 :(得分:4)

由于这将在Windows上运行,因此您可以使用FindFirstFile,FindNextFile和FindClose。这里有一个例子:http://msdn.microsoft.com/en-us/library/aa364418(VS.85).aspx

答案 2 :(得分:3)

你必须重新发明一大堆轮子才能在文件名中使用通配符,甚至可以更多地使用通配符。尝试使用cygwin的bashunix2dos

答案 3 :(得分:0)

为什么不按原样运行程序,让一些(。)bat(ch)文件魔法扩展通配符?

关于如何执行此操作,请参阅此处:http://support.microsoft.com/kb/68268/en-us

虽然你要为每个要转换的文件开始一个新的过程,这是一个非常昂贵的,但它会让你无法使用你似乎不喜欢的语言进行黑客攻击......; - )