Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > SetCurrentDirectory


Автор: asdfcdfdc 2.6.2011, 00:18
Привет всем!
помогите решить проблему с SetCurrentDirectory
если я хочу установить 
SetCurrentDirectory("C:\Новая папка");
так-же есть SetCurrentDirectoryW - пробывал с ней тоже самое не могу не как установить...в чем может быть трабла протестите плиз у себя как у вас устанавливаеся если есть папка на русском?...заранее спасибо

Автор: borisbn 2.6.2011, 05:52
Не
SetCurrentDirectory("C:\ Новая папка");
а
SetCurrentDirectory("C:\\Новая папка");

Автор: asdfcdfdc 2.6.2011, 08:11
Цитата

Не
SetCurrentDirectory("C:\ Новая папка");

a
S
Цитата

etCurrentDirectory("C:\\Новая папка"); 


угу сорри опечатался...но даже если так всеравно не устанавливается...

Автор: borisbn 2.6.2011, 09:30
Цитата(asdfcdfdc @  2.6.2011,  08:11 Найти цитируемый пост)
но даже если так всеравно не устанавливается...

1. Попробуй так
Код

SetCurrentDirectory("\"C:\\Новая папка\"");

2. А как ты узнаёшь, что
Цитата(asdfcdfdc @  2.6.2011,  08:11 Найти цитируемый пост)
не устанавливается

?

Автор: asdfcdfdc 2.6.2011, 10:06
сек ну вот допустим подправил как ты хотел, не устанвливается..
Код

TCHAR buffer[MAX_PATH];
GetCurrentDirectory(sizeof(buffer),buffer);
cout << buffer << endl;
// cin.getline(buffer,sizeof(buffer));
strcpy(buffer,"\"C:\\Новая папка\""); 
cout<<buffer<<endl;
SetCurrentDirectory(buffer);
GetCurrentDirectory(sizeof(buffer),buffer);
cout << buffer << endl;


M
GremlinProg
пользуйтесь инструментами форматирования текста, пожалуйста

Автор: Alca 2.6.2011, 10:11
Цитата

не устанавливается

да, да, проясни

Добавлено через 1 минуту и 10 секунд
Покажи вывод программы

Добавлено через 2 минуты и 47 секунд
И где проверка результатов апишных функций?

Добавлено через 3 минуты и 45 секунд
Код

#include <windows.h> 
#include <stdio.h>
#include <tchar.h>

#define BUFSIZE MAX_PATH
 
void _tmain(int argc, TCHAR **argv) 

   TCHAR Buffer[BUFSIZE];
   DWORD dwRet;

   if(argc != 2)
   {
      _tprintf(TEXT("Usage: %s <dir>\n"), argv[0]);
      return;
   }

   dwRet = GetCurrentDirectory(BUFSIZE, Buffer);

   if( dwRet == 0 )
   {
      printf("GetCurrentDirectory failed (%d)\n", GetLastError());
      return;
   }
   if(dwRet > BUFSIZE)
   {
      printf("Buffer too small; need %d characters\n", dwRet);
      return;
   }

   if( !SetCurrentDirectory(argv[1]))
   {
      printf("SetCurrentDirectory failed (%d)\n", GetLastError());
      return;
   }
   _tprintf(TEXT("Set current directory to %s\n"), argv[1]);

   if( !SetCurrentDirectory(Buffer) )
   {
      printf("SetCurrentDirectory failed (%d)\n", GetLastError());
      return;
   }
   _tprintf(TEXT("Restored previous directory (%s)\n"), Buffer);
}


Добавлено через 4 минуты и 7 секунд
http://msdn.microsoft.com/en-us/library/aa363806(v=vs.85).aspx

Автор: GremlinProg 2.6.2011, 10:15
SetCurrentDirectory возвращает результат, который неплохо бы поизучать:
Цитата(SetCurrentDirectory Function @  MSDN)

If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.


Добавлено через 1 минуту и 7 секунд
Цитата(Alca @  2.6.2011,  12:11 Найти цитируемый пост)
И где проверка результатов апишных функций?

угу  smile 

Автор: asdfcdfdc 2.6.2011, 10:37
 ну вот смотрите...
Код

        TCHAR buffer[MAX_PATH];
        GetCurrentDirectory(sizeof(buffer),buffer);
        cout << buffer << endl;
      //cin.getline(buffer,sizeof(buffer));  
        
        strcpy(buffer,"C:\\Новая папка"); -<если я использую так то все работает
    if(!SetCurrentDirectory(buffer))
        cout<<GetLastError()<<endl;

        GetCurrentDirectory(sizeof(buffer),buffer);
        cout << buffer << endl;

cin.getline(buffer,sizeof(buffer));   - когда использую это 
пример так 
C:\\Новая папка  или так C:\Новая папка GetLastError() выдает код ошибки 2

Автор: GremlinProg 2.6.2011, 10:42
Цитата(asdfcdfdc @  2.6.2011,  12:37 Найти цитируемый пост)
strcpy(buffer,"C:\\Новая папка"); -< если я использую так то все работает

Цитата(asdfcdfdc @  2.6.2011,  12:37 Найти цитируемый пост)
C:\\Новая папка  или так C:\Новая папка GetLastError() выдает код ошибки 2

так что не работает-то?

код ошибки 2: "Не удается найти указанный файл."

Автор: asdfcdfdc 2.6.2011, 10:47
мне нужно программно устанавливать директорию
Код

TCHAR buffer[MAX_PATH];
GetCurrentDirectory(sizeof(buffer),buffer);
cout << buffer << endl;
cin.getline(buffer,sizeof(buffer));  - получаю с консоли в буфер пример так C:\\Новая папка или C:\Новая папка
//Эта проблема возникает если переходить в папки с рус.названием...
// strcpy(buffer,"C:\\Новая папка"); -< это для примера было, если устанавливать дир.не программно

    if(!SetCurrentDirectory(buffer))
        cout<<GetLastError()<<endl;
        GetCurrentDirectory(sizeof(buffer),buffer);
        cout << buffer << endl;


не программно работает 
strcpy(buffer,"C:\\Новая папка");

не работает
SetCurrentDirectory("\"C:\\Новая папка\"");
или
SetCurrentDirectory("C:\\Новая папка");
или
SetCurrentDirectory("C:\Новая папка\");
или 
SetCurrentDirectory("C:\\Новая папка\");

программно не работает
использование 
cin.getline(buf);
cin>>buf;

нужно с консоли программно установить директорию с рус.название

Автор: RastaDja 2.6.2011, 11:28

Цитата(asdfcdfdc @  2.6.2011,  11:47 Найти цитируемый пост)
не программно работает 
strcpy(buffer,"C:\\Новая папка");

не работает
SetCurrentDirectory("\"C:\\Новая папка\"");
или
SetCurrentDirectory("C:\\Новая папка");
или
SetCurrentDirectory("C:\Новая папка\");
или 
SetCurrentDirectory("C:\\Новая папка\");

программно не работает
использование 
cin.getline(buf);
cin>>buf;

ОМГ  smile. что тут написано. Вы сами понимаете? ЗапЯтые ещё не отменил никто.

Автор: GremlinProg 2.6.2011, 11:34
вот оно что  smile 
программно, т.е. из консоли

значит проблема не с SetCurrentDirectory, а с кодировкой

Код

setlocale(LC_ALL,".866");// кодировка dos
setlocale(LC_ALL,".1251");// кодировка windows

одно из двух должно помочь, если вызвать перед любым чтением из консоли

Автор: afiskon 2.6.2011, 14:10
Ну вы, ребят, извращенцы smile
Код

SetCurrentDirectoryW(L"C:\\папка");

Если в настройках проекта указано, что он в юникоде, можно просто SetCurrentDirectory, но строка обязательно должна быть в юникоде L"...."

Автор: GremlinProg 2.6.2011, 14:16
Цитата(afiskon @  2.6.2011,  16:10 Найти цитируемый пост)
SetCurrentDirectoryW(L"C:\\папка");

вообще-то настройки проекта на этот вызов ни как не влияют  smile 

Автор: afiskon 2.6.2011, 15:10
Хм... мне казалось, что в 10-й студии влияет. Ну да ладно...

Автор: asdfcdfdc 5.6.2011, 17:57
Цитата

#include <Windows.h>
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <time.h>
#include <locale.h>
using namespace std;
int main(){
        setlocale(LC_ALL,".1251");// кодировка windows
        TCHAR buffer[MAX_PATH];
    GetCurrentDirectory(sizeof(buffer),buffer);
    cout << buffer << endl;
    cin.getline(buffer,sizeof(buffer));  
    if(!SetCurrentDirectory(buffer))
    cout<<GetLastError()<<endl;
    GetCurrentDirectory(sizeof(buffer),buffer);
    cout << buffer << endl;
        getch();
        return 0;
}

не могу программно перейти в C:\Новая папка она естесвенно существует и в любую другую папку имеющую русские имена в чем проблема кто подскажет?
C:\newdir -нормально отрабатывает
C:\Новая папка не работает
готов заплатить 50руб. спецу кто решит данный вопрос, я уже сомневаюсь  что можно что-то сделать ибо баг винды


Автор: GremlinProg 6.6.2011, 06:02
Цитата(asdfcdfdc @  5.6.2011,  19:57 Найти цитируемый пост)
не могу программно перейти в C:\Новая папка она естесвенно существует и в любую другую папку имеющую русские имена в чем проблема кто подскажет?

за бесплатно могу еще раз повторить: проблема в кодировке!

Добавлено через 5 минут и 9 секунд
1. выводи буфер, в который считывается getline в консоль
2. используй OemToChar, если не получается с setlocale

Добавлено через 7 минут и 4 секунды
+ у консоли есть возможность поставить шрифт, Lucida Console понимант русские кодировки

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)