Принятие подстановочного знака для открытия файла - PullRequest
4 голосов
/ 07 октября 2011

ОК, это неловко, и как бы я ни ненавидел, у меня нет другого выхода. Я не знаю C, но мне представили проблему, которую мне нужно решить, и хотя я провел некоторое исследование, мне потребовалось бы слишком много времени, чтобы изменить программу, так что я должен проглотить свою гордость (и Я предполагаю, что некоторые респ) попросят о помощи.

Это простая программа для преобразования файла Unix в DOS, единственная проблема в том, что мне нужно, чтобы он принимал символы подстановки (например .. c: /> unix2dos * .txt или file * .txt). Ничего особенного.

Вот код, который у меня сейчас ..

    // 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 ]

4 голосов
/ 07 октября 2011

* nix-оболочки (например, bash) автоматически расширяют подстановочные аргументы.Оболочки Windows нет.Но библиотека времени выполнения Microsoft Visual C имеет возможность сделать это автоматически при запуске вашей программы.Как это сделать, объяснено здесь .В основном вам нужно связать с setargv.obj.

4 голосов
/ 07 октября 2011

Поскольку это будет работать в Windows, вы можете использовать FindFirstFile, FindNextFile и FindClose.Вот пример: http://msdn.microsoft.com/en-us/library/aa364418(VS.85).aspx

3 голосов
/ 07 октября 2011

Вам придется заново изобретать целую кучу колес, чтобы использовать подстановочные знаки в именах файлов, и даже больше, чтобы сделать это переносимо. Попробуйте использовать bash и unix2dos.

в Cygwin.
0 голосов
/ 07 октября 2011

Почему бы не принять программу как есть, и позволить некоторому (.) Волшебному файлу (ch) сделать расширение подстановочных знаков?

О том, как это сделать, см. Здесь: http://support.microsoft.com/kb/68268/en-us

Хотя вы начинаете новый процесс для каждого конвертируемого файла, что довольно дорого, оно сохранит вас.от взлома с использованием языка, который вам не нравится ...; -)

...