Am nevoie de numele utilizatorului curent conectat în aplicația mea Air / Flex. Aplicația va fi implementată numai pe mașinile Windows. Cred că aș putea realiza acest lucru prin regexarea directorului de utilizatori, dar sunt deschis și altor moduri.
Aici este o soluție care funcționează în XP / Vista, dar este cu siguranță extensibilă la OSX, linux, aș fi în continuare interesat într-un alt mod.
public static function GetCurrentOSUser():String{
// XP & Vista only.
var userDirectory:String = File.userDirectory.resolvePath("").nativePath;
var startIndex:Number = userDirectory.lastIndexOf("\\") + 1
var stopIndex:Number = userDirectory.length;
var user = userDirectory.substring(startIndex, stopIndex);
return user;
}
Există câteva curățări mici pe care le puteți face ...
package
{
import flash.filesystem.File;
public class UserUtil
{
public static function get currentOSUser():String
{
var userDir:String = File.userDirectory.nativePath;
var userName:String = userDir.substr(userDir.lastIndexOf(File.separator) + 1);
return userName;
}
}
}
Așa cum a sugerat Kevin, folosiți File.separator
pentru a face directorul să împartă platforma (doar testată pe Windows și Mac OS X).
Nu trebuie să utilizați resolvePath ("")
decât dacă căutați un copil.
De asemenea, realizarea funcției de obținere adecvată permite legarea fără alte lucrări.
În exemplul de mai sus am introdus-o într-o clasă UserUtil
, acum pot lega la UserUtil.currentOSUser
, de exemplu:
Aceasta nu este cea mai frumoasă abordare, dar dacă știți că aplicația dvs. AIR va fi rulată într-un mediu Windows, funcționează destul de bine:
public var username:String;
public function getCurrentOSUser():void
{
var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo();
var file:File = new File("C:/WINDOWS/system32/whoami.exe");
nativeProcessStartupInfo.executable = file;
process = new NativeProcess();
process.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onOutputData);
process.start(nativeProcessStartupInfo);
}
public function onOutputData(event:ProgressEvent):void
{
var output:String = process.standardOutput.readUTFBytes(process.standardOutput.bytesAvailable);
this.username = output.split('\\')[1];
trace("Got username: ", this.username);
}