我尝试使用此代码接受来自控制台应用程序的参数。不幸的是,我得到的是一些奇怪的原因的布尔值。我不确定发生了什么。我想我可能会混合命名空间或其他东西。任何人吗?
#include "stdafx.h"
using namespace System;
using namespace System::Net;
using namespace System::IO;
using namespace System::Collections;
using namespace System::Text;
void uploadFile(String^ strFileName, String^ strServerName, String^ strUserName, String^ strPassword);
void prompt();
int main(int argc, char* argv[])
{
if (argc < 9)
{
prompt();
}
else if (argc == 9)
{
char* fileName;
char* serverName;
char* userName;
char* password;
for (int i = 1; i < argc; i++)
{
if (argv[i] == "-f")
fileName = argv[i + 1];
else if (argv[i] == "-s")
serverName = argv[i + 1];
else if (argv[i] == "-u")
userName = argv[i + 1];
else if (argv[i] = "-p")
password = argv[i + 1];
else
prompt();
Console::WriteLine(argv[i]);
}
String ^strFileName = gcnew String(fileName);
String ^strServerName = gcnew String(serverName);
String ^strUserName = gcnew String(userName);
String ^strPassword = gcnew String(password);
Console::WriteLine(argv[1]);
Console::WriteLine(strFileName);
uploadFile(strFileName, strServerName, strUserName, strPassword);
}
else
{
prompt();
}
}
void uploadFile(String^ strFileName, String^ strServerName, String^ strUserName, String^ strPassword)
{
if (!strServerName->StartsWith("ftp://"))
{
String^ host = "ftp://";
host += strServerName;
strServerName = host;
}
String^ path = Directory::GetCurrentDirectory();
WebClient^ wclient = gcnew WebClient();
wclient->Credentials = gcnew NetworkCredential(strUserName, strPassword);
String^ destFileName = path;
destFileName += strFileName;
Console::WriteLine(destFileName);
Console::WriteLine(strServerName);
/*array<Byte>^response = wclient->UploadFile(strServerName, destFileName);
if (response->Length > 0)
{
ASCIIEncoding^ ascii = gcnew ASCIIEncoding;
String^ decoded = ascii->GetString(response);
Console::WriteLine("Response: {0}", decoded);
}*/
}
void prompt()
{
Console::WriteLine("Usage: ftpCLI.exe -f <filename> -s <server> -u <username> -p <password>\n");
Console::ReadLine();
Environment::Exit(1);
}
对于任何对此感兴趣的人都是已实施并完成决议的计划。
#include "stdafx.h"
#include <string.h>
using namespace System;
using namespace System::Net;
using namespace System::IO;
using namespace System::Collections;
using namespace System::Text;
void uploadFile(String^ strFileName, String^ strServerName, String^ strUserName, String^ strPassword);
void prompt();
int main(int argc, char* argv[])
{
if (argc < 9)
{
prompt();
}
else if (argc == 9)
{
char* fileName;
char* serverName;
char* userName;
char* password;
for (int i = 1; i < argc; i++)
{
if (strcmp(argv[i], "-f") == 0)
fileName = argv[i + 1];
else if (strcmp(argv[i], "-s") == 0)
serverName = argv[i + 1];
else if (strcmp(argv[i], "-u") == 0)
userName = argv[i + 1];
else if (strcmp(argv[i], "-p") == 0)
password = argv[i + 1];
Console::WriteLine(argv[i]);
}
String ^strFileName = gcnew String(fileName);
String ^strServerName = gcnew String(serverName);
String ^strUserName = gcnew String(userName);
String ^strPassword = gcnew String(password);
Console::WriteLine(argv[1]);
uploadFile(strFileName, strServerName, strUserName, strPassword);
}
else
{
prompt();
}
}
void uploadFile(String^ strFileName, String^ strServerName, String^ strUserName, String^ strPassword)
{
if (!strServerName->StartsWith("ftp://"))
{
String^ host = "ftp://";
host += strServerName;
strServerName = host;
}
String^ path = Directory::GetCurrentDirectory();
WebClient^ wclient = gcnew WebClient();
wclient->Credentials = gcnew NetworkCredential(strUserName, strPassword);
String^ destFileName = strServerName;
destFileName += "/" + strFileName;
array<Byte>^response = wclient->UploadFile(destFileName, strFileName);
if (response->Length > 0)
{
ASCIIEncoding^ ascii = gcnew ASCIIEncoding;
String^ decoded = ascii->GetString(response);
Console::WriteLine("Response: {0}", decoded);
}
}
void prompt()
{
Console::WriteLine("Usage: ftpCLI.exe -f <filename> -s <server> -u <username> -p <password>\n");
Console::ReadLine();
Environment::Exit(1);
}
答案 0 :(得分:1)
在CLR控制台中,您的主要应该是:
int main(array<System::String ^> ^args)
答案 1 :(得分:1)
这个循环很麻烦:
for (int i = 1; i < argc; i++)
{
if (argv[i] == "-f")
fileName = argv[i + 1];
else if (argv[i] == "-s")
serverName = argv[i + 1];
else if (argv[i] == "-u")
userName = argv[i + 1];
else if (argv[i] = "-p")
password = argv[i + 1];
else
prompt();
Console::WriteLine(argv[i]);
}
让我们说第一个参数是-f
,后面跟着文件名。第一次循环运行,得到-f
并提取文件名。然而,您argv[i]
的下一次迭代将是您在第一次迭代中提取的文件名。
当您获得带参数的参数(例如-f
)时,您需要在额外时间后增加i
。
编辑:正如heavyd所述,您遇到的实际问题可能是字符串的比较。您不能将等号运算符用于原始C风格的字符串,您必须使用例如strcmp
像这样:
if (strcmp(argv[i], "-f") == 0) { ... }