IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   C++ помощь в програмирование :help: (http://www.imho.ws/showthread.php?t=69040)

-Time- 22.09.2004 12:34

C++ помощь в програмирование :help:
 
Вот столкнулся с проблемой :
Пробывал написать маленькую програмку что бы когда в отдельной папке появлялся новый файл она выполняла действие ( музыка к примеру )

Но как выяснилось сишка не такая уж и простая как кажеться ((((


Может у кого кусок кода валяеться ?
Буду очень признателен


Спасибо

Dimm 22.09.2004 13:21

-Time-

Не все так сложно:

1) Определяешь и запускаешь отдельный поток.
2) В нем вызываешь Win32 API функцию ReadDirectoryChangesW. (смотри в MSDN). Функция может работать как синхронно так и асинхронно. Определяешь нужный тебе фильтр (NotifyFilter) и вызываешь. Функция возвращается, когда произошли изменения в директории.
По результатам нотификации определяешь, что произошло ( в твоём случае - появление нового файла) и выполняешь своё действие (игрешь музыку).
Все это должно работать в цикле (если тебе надо следить постоянно).


П.С.
в .NET используется класс FileSystemWatcher.

-Time- 22.09.2004 13:52

[Ghost]
если не сложно можно хоть маленький пример ...

у меня С++ буилдер ... искал в хелпе eadDirectoryChangesW пусто .... ((

Dimm 22.09.2004 14:10

-Time-

Дык имя функции я привел из Win32 API. VC++ работает с Win32 API напрямую. Не знаю как там С++ билдер. Ты вообще работал с Win32 API из билдера?

Вот тебе объяснение:
http://msdn.microsoft.com/library/de...rychangesw.asp

а вот пример:
http://msdn.microsoft.com/library/de...hangeswapi.asp

-Time- 22.09.2004 16:07

[Ghost] не не работал, но щас вот пытаюсь ....


Спасибо щас бум читать

-Time- 22.09.2004 17:40

если не трудно подскажите почему не работает ?

Цитата:

#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>

void scandir(char *dirname)
{
DIR *dir;
struct dirent *ent;

printf("First pass on '%s':\n",dirname);
if ((dir = opendir(dirname)) == NULL)
{
perror("Unable to open directory");
exit(1);
}
while ((ent = readdir(dir)) != NULL)
printf("%s\n",ent->d_name);

printf("Second pass on '%s':\n",dirname);

rewinddir(dir);
while ((ent = readdir(dir)) != NULL)
printf("%s\n",ent->d_name);
if (closedir(dir) != 0)
perror("Unable to close directory");
}

void main(int argc,char *argv[])
{
if (argc != 2)
{
printf("usage: opendir dirname\n");
exit(1);
}
scandir(argv[1]);
exit(0);
}

VeryLucky 24.09.2004 16:10

FileSystemWatcher

-Time- 25.09.2004 18:44

ну народ подскажите почему не пашет (((
очень нужно ...

Dimm 25.09.2004 20:28

-Time-

Во-первых задавай вопрос точнее:

что значить не работает? Есть много степеней "не работы":
программа может падать, не делаеть то что надо и т.д.

Во-вторых условия:
какая среда разработки (VС++, C++ Builder)

В-третьих, что она вообще должна делать?

-Time- 27.09.2004 00:49

[Ghost]
Цитата:

Во-первых задавай вопрос точнее:
в том то и дело ничего (

при запуске просто выдаёт First pass on



В-третьих, что она вообще должна делать?

програма должна просто проверять определёную папку на появление новых файлов, при появление выполнять звуковой сигнал.

Спасибо

Dimm 27.09.2004 02:28

Не на писал Во-вторых. Судя по всему с++ билдер.

Все абсолютно законно - First pass on. После 1-го вызова функции scandir программа выходит из main.

Я не вижу у тебя объявления потока (thread). А ведь я писал об этом в 1-ом посте.
Сканирование папки на изменения файла - процесс постоянный, а не одноразовый. И выполняться это должно в отдельном потоке. А так она у тебя один раз проверяет папку на изменения и выходит.

Смотри на примеры в MSDN по линку который я тебе дал.

Dimm 29.09.2004 17:17

Вот пример:

Код:

public class Watcher
{

    public static void Main()
    {

        string[] args = System.Environment.GetCommandLineArgs();
 
        // If a directory is not specified, exit program.
        if(args.Length != 2)
        {
            // Display the proper way to call the program.
            Console.WriteLine("Usage: Watcher.exe (directory)");
            return;
        }

        // Create a new FileSystemWatcher and set its properties.
        FileSystemWatcher watcher = new FileSystemWatcher();
        watcher.Path = args[1];
        /* Watch for changes in LastAccess and LastWrite times, and
          the renaming of files or directories. */
        watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
          | NotifyFilters.FileName | NotifyFilters.DirectoryName;
        // Only watch text files.
        watcher.Filter = "*.txt";

        // Add event handlers.
        watcher.Changed += new FileSystemEventHandler(OnChanged);
        watcher.Created += new FileSystemEventHandler(OnChanged);
        watcher.Deleted += new FileSystemEventHandler(OnChanged);
        watcher.Renamed += new RenamedEventHandler(OnRenamed);

        // Begin watching.
        watcher.EnableRaisingEvents = true;

        // Wait for the user to quit the program.
        Console.WriteLine("Press \'q\' to quit the sample.");
        while(Console.Read()!='q');
    }

    // Define the event handlers.
    private static void OnChanged(object source, FileSystemEventArgs e)
    {
        // Specify what is done when a file is changed, created, or deleted.
      Console.WriteLine("File: " +  e.FullPath + " " + e.ChangeType);
    }

    private static void OnRenamed(object source, RenamedEventArgs e)
    {
        // Specify what is done when a file is renamed.
        Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);
    }
}


gandalf_g 30.09.2004 09:55

пример за мониторингом папки на сях тут
воспользуйся поиском "ReadDirectoryChanges" в инете есть примеры.

apolo.m.e 22.03.2005 15:05

Плиз помогите горю:
нужна консольная програмка на С++ на тему:
1. Создать "Справочник покупателя". В него входят: база
торговых точек города
название,
адрес и телефон

специализация и время работы.
Выбор магазинов по произвольному шаблону (т.е. поиск по
любому из параметров)

2. Создать программу тестирующую пользователя по какой-либо
предметной области.

Программа должна иметь возможность загрузить необходимый
тест из файла, а также выгрузить
в отдельный файл результаты сдачи данного теста текущим
пользователем.

Любую, на выбор. Если есть возможность ----- apolo.m.e@mail.ru


Часовой пояс GMT +4, время: 21:12.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.